⚒️

Cloud BuildでDockerfileからimageを作成してGCRにpushする

2021/04/20に公開

要件

  • Go1.16での動作を想定
  • Cloud BuildでDockerfileからimageを作成してGCRにpushしたい
  • go build時にprivateリポジトリのソースコードをgo mod vendorにてmoduleとして取り込んで利用するため、private repoへのアクセス権限を有したい

secret managerにてsecretの作成

事前に、cloudbuildからsecret mangerへアクセスしてPAT(Personal access tokens)を取得できる様にする為にsecretを作成します

名前は github-access-token としています。

作成画面

作成後

コード

cloudbuild.yaml

steps:

  # Access the id_github file from Secret Manager
  - name: gcr.io/cloud-builders/gcloud
    entrypoint: 'bash'
    args: [ '-c', 'gcloud secrets versions access latest --secret=github-access-token > /root/github-access-token' ]
    volumes:
      - name: 'vol'
        path: /root/

  # Build the container image
  - name: 'docker'
    entrypoint: 'sh'
    args: [
        '-c',
        'docker build --build-arg CREDENTIALS="$(cat /root/github-access-token)"
      -f Dockerfile
      -t us.gcr.io/$PROJECT_ID/${_IMAGE_NAME}:$COMMIT_SHA
      -t us.gcr.io/$PROJECT_ID/${_IMAGE_NAME}:latest
    .'
    ]
    volumes:
      - name: 'vol'
        path: /root/

  # Push the container image
  - name: gcr.io/cloud-builders/docker
    args:
      - push
      - us.gcr.io/$PROJECT_ID/${_IMAGE_NAME}

timeout: 1200s

github: https://github.com/momota10/gcp-samples/blob/master/cloudbuild/build-push/cloudbuild.yaml

Dockerfile

FROM golang:1.16-alpine as builder
RUN apk add --update --no-cache ca-certificates git gcc musl-dev

# git
ARG CREDENTIALS

RUN git config \
    --system \
    url."https://${CREDENTIALS}:x-oauth-basic@github.com/{your-org}".insteadOf \
    "https://github.com/{your-org}"

# go
RUN go env -w GOPRIVATE="github.com/{your-org}"
WORKDIR /go/src/github.com/{your-org}/{your-repo}
COPY . .

RUN GOOS=linux CGO_ENABLED=0 go build -ldflags "-s -w" -o bin/app -v main.go


FROM gcr.io/google.com/cloudsdktool/cloud-sdk:alpine
COPY --from=builder /go/src/github.com/{your-org}/{your-repo}/bin/app /app
EXPOSE 8080
ENTRYPOINT ["/app"]

Discussion