type holyshared = Engineer<mixed>

技術的なことなど色々

build-push-actionでsecretを扱う

npmのプライベートなパッケージをインストールするのに環境変数を利用している際、DockerのコンテナをNPMのアクセストークンが漏れないようにビルドする必要が出たりします。

例えば.yarnrc.ymlで環境変数を参照している場合などです。

npmAuthToken: "${NPM_AUTH_TOKEN}"

この場合、Dockerコンテナをビルドする場合、環境変数をSecretとしマウントします。

docker buildx build -f packages/api/Dockerfile \
  --secret id=npm_auth_token,env=NPM_AUTH_TOKEN \
  -t api:latest .

Dockerファイルでは--mount=type=secretを利用して参照します。
これでプライベートなパッケージもインストールでき、NPMのアクセストークンも漏れないはずです。

FROM --platform=x86_64 node:22.17.0-bullseye-slim AS builder

COPY package.json yarn.lock tsconfig.json .yarnrc.yml /app/

WORKDIR /app

# id,envはdockerコマンドで指定する。
RUN --mount=type=secret,id=npm_auth_token,env=NPM_AUTH_TOKEN yarn workspaces focus -A --production

ここまでできたらGithub Actionsでbuild-push-actionを利用して、コンテナをpushできるようになります。
秘匿情報はbuild-push-actionのsecret-envsをid=環境変数名形式で指定すれば利用できます。

- uses: docker/build-push-action@v5
  env:
    NPM_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}
  with:
    push: true
    file: "packages/api/Dockerfile"
    provenance: false
    tags: |
      ${{ secrets.REPOSITORY_URL }}:latest
    secret-envs: |
      "npm_auth_token=NPM_AUTH_TOKEN"

無事にGithub Actionsでコンテナがビルドできれば問題ありません。