diff --git a/.github/workflows/build-base-images.yml b/.github/workflows/build-base-images.yml index 983b19d..1856d43 100644 --- a/.github/workflows/build-base-images.yml +++ b/.github/workflows/build-base-images.yml @@ -51,8 +51,7 @@ jobs: strategy: matrix: image: - - { name: go-builder, file: deploy/base-images/go-builder.Dockerfile } - - { name: go-runtime, file: deploy/base-images/go-runtime.Dockerfile } + - { name: go-base, file: deploy/base-images/go-base.Dockerfile } - { name: node-builder, file: deploy/base-images/node-builder.Dockerfile } - { name: node-runtime, file: deploy/base-images/node-runtime.Dockerfile } - { name: openresty-geoip, file: deploy/base-images/openresty-geoip.Dockerfile } diff --git a/.github/workflows/build-service-images.yml b/.github/workflows/build-service-images.yml index 57df5d1..a2705ed 100644 --- a/.github/workflows/build-service-images.yml +++ b/.github/workflows/build-service-images.yml @@ -104,10 +104,12 @@ jobs: tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} build-args: | - NODE_BUILDER_IMAGE=${{ env.REGISTRY }}/${{ env.BASE_ORG }}/node-builder@${{ inputs.node_builder_digest }} - NODE_RUNTIME_IMAGE=${{ env.REGISTRY }}/${{ env.BASE_ORG }}/node-runtime@${{ inputs.node_runtime_digest }} - POSTGRES_RUNTIME_IMAGE=${{ env.REGISTRY }}/${{ env.BASE_ORG }}/postgres-runtime@${{ inputs.postgres_runtime_digest }} - OPENRESTY_GEOIP_IMAGE=${{ env.REGISTRY }}/${{ env.BASE_ORG }}/openresty-geoip@${{ inputs.openresty_geoip_digest }} + GO_BUILDER_IMAGE=${{ env.REGISTRY }}/${{ env.ORG }}/go-builder@${{ inputs.node_builder_digest }} + GO_RUNTIME_IMAGE=${{ env.REGISTRY }}/${{ env.ORG }}/go-runtime@${{ inputs.node_runtime_digest }} + NODE_BUILDER_IMAGE=${{ env.REGISTRY }}/${{ env.ORG }}/node-builder@${{ inputs.node_builder_digest }} + NODE_RUNTIME_IMAGE=${{ env.REGISTRY }}/${{ env.ORG }}/node-runtime@${{ inputs.node_runtime_digest }} + OPENRESTY_GEOIP_IMAGE=${{ env.REGISTRY }}/${{ env.ORG }}/openresty-geoip@${{ inputs.openresty_geoip_digest }} + POSTGRES_RUNTIME_IMAGE=${{ env.REGISTRY }}/${{ env.ORG }}/postgres-runtime@${{ inputs.postgres_runtime_digest }} # ----------------------------- # SBOM diff --git a/account/Dockerfile b/account/Dockerfile index 0d95d01..cf0e672 100644 --- a/account/Dockerfile +++ b/account/Dockerfile @@ -1,5 +1,8 @@ # Multi-stage production build for the account service -FROM golang:1.23 AS builder + +ARG GO_BASE_IMAGE + +FROM ${GO_BUILDER_IMAGE} AS builder WORKDIR /src COPY go.mod go.sum ./ @@ -8,7 +11,9 @@ COPY . . RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /out/accountsvc ./account/cmd/accountsvc -FROM debian:12-slim AS runtime +# PROD Image + +FROM ${GO_RUNTIME_IMAGE} AS runtime ENV CONFIG_PATH=/etc/xcontrol/account/account.yaml \ PORT=8080 @@ -19,39 +24,7 @@ RUN apt-get update \ WORKDIR /app COPY --from=builder /out/accountsvc /usr/local/bin/accountsvc COPY account/config/account.yaml /etc/xcontrol/account/account.yaml - -RUN <<'SCRIPT' > /usr/local/bin/account-entrypoint.sh -#!/usr/bin/env bash -set -euo pipefail - -CONFIG_FILE="${CONFIG_PATH:-/etc/xcontrol/account/account.yaml}" -DEFAULT_CONFIG="/etc/xcontrol/account/account.yaml" -mkdir -p "$(dirname "${CONFIG_FILE}")" - -if [ ! -f "${CONFIG_FILE}" ]; then - cp "${DEFAULT_CONFIG}" "${CONFIG_FILE}" -fi - -if [ -n "${PORT:-}" ]; then - tmp_cfg=$(mktemp) - awk -v port="$PORT" ' - /^server:/ {print; in_server=1; addr_written=0; next} - in_server && /^ addr:/ {print " addr: \":" port "\""; addr_written=1; next} - in_server && /^ [^ ]/ {in_server=0} - {print} - END { - if (port != "" && in_server == 0 && addr_written == 0) { - print "server:"; - print " addr: \":" port "\""; - } - } - ' "${CONFIG_FILE}" > "${tmp_cfg}" - CONFIG_FILE="${tmp_cfg}" -fi - -exec /usr/local/bin/accountsvc --config "${CONFIG_FILE}" "$@" -SCRIPT - +COPY account-entrypoint.sh /usr/local/bin/account-entrypoint.sh RUN chmod +x /usr/local/bin/account-entrypoint.sh VOLUME ["/etc/xcontrol/account"] diff --git a/account/entrypoint.sh b/account/entrypoint.sh new file mode 100644 index 0000000..048e1ad --- /dev/null +++ b/account/entrypoint.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +set -euo pipefail + +CONFIG_FILE="${CONFIG_PATH:-/etc/xcontrol/account/account.yaml}" +DEFAULT_CONFIG="/etc/xcontrol/account/account.yaml" +mkdir -p "$(dirname "${CONFIG_FILE}")" + +if [ ! -f "${CONFIG_FILE}" ]; then + cp "${DEFAULT_CONFIG}" "${CONFIG_FILE}" +fi + +if [ -n "${PORT:-}" ]; then + tmp_cfg=$(mktemp) + awk -v port="$PORT" ' + /^server:/ {print; in_server=1; addr_written=0; next} + in_server && /^ addr:/ {print " addr: \":" port "\""; addr_written=1; next} + in_server && /^ [^ ]/ {in_server=0} + {print} + END { + if (port != "" && in_server == 0 && addr_written == 0) { + print "server:"; + print " addr: \":" port "\""; + } + } + ' "${CONFIG_FILE}" > "${tmp_cfg}" + CONFIG_FILE="${tmp_cfg}" +fi + +exec /usr/local/bin/accountsvc --config "${CONFIG_FILE}" "$@" +SCRIPT diff --git a/deploy/base-images/go-runtime.Dockerfile b/deploy/base-images/go-base.Dockerfile similarity index 100% rename from deploy/base-images/go-runtime.Dockerfile rename to deploy/base-images/go-base.Dockerfile diff --git a/deploy/base-images/go-builder.Dockerfile b/deploy/base-images/go-builder.Dockerfile deleted file mode 100644 index ea7a7ae..0000000 --- a/deploy/base-images/go-builder.Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM ubuntu:24.04 - -LABEL maintainer="XControl" \ - description="Go 1.23 builder image with common dependencies for XControl services" - -ENV GO_VERSION=1.23.8 \ - CGO_ENABLED=0 \ - GOOS=linux \ - GOARCH=amd64 \ - PATH=/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin - -RUN set -eux; \ - apt-get update; \ - apt-get install -y --no-install-recommends \ - ca-certificates \ - curl \ - git \ - build-essential; \ - rm -rf /var/lib/apt/lists/*; \ - curl -fsSL "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" -o /tmp/go.tgz; \ - tar -C /usr/local -xzf /tmp/go.tgz; \ - rm /tmp/go.tgz - -WORKDIR /workspace - -CMD ["bash"]