Dockerhubのオートビルドで環境変数を使う方法


Dockerhubのオートビルドでは、プロジェクト固有の環境変数を使うことができます。ただ、設定が結大変だったので、忘備録も兼ねてまとめます。オートビルドで環境変数を使うために必要な工程は、以下の3つです。

  1. BUILD ENVIRONMENT VARIABLES
  2. hooks/build
  3. Dockerfile ARG

サンプルコード

以下が今回の解説に使うソースコード、Dockerリポジトリです。

ソースコード
https://github.com/kaidouji85/study-three-js

Dockerリポジトリ
https://hub.docker.com/r/kaidouji85/gbraver-burst

このコードは私が趣味で作っているゲームですが、遊び方説明動画としてYouTubeを埋め込んでいます。YouTubeのURLをハードコーディングするのも気が引けたので、HOW_TO_PLAY_URLという環境変数で設定を外出し出来るようにしました。

環境変数設定方法

1. BUILD ENVIRONMENT VARIABLES

dockerhubのオートビルド設定画面を開くと、「BUILD ENVIRONMENT VARIABLES」という項目があります。「Key」に環境変数名、「Value」にその値をセットします。これだけで環境変数が使えそうですが、そうは問屋が卸しません。

2. hooks/build

Dockerhub公式サイトにさりげなく書いてありますが、前節で設定した項目はhooksフォルダ配下のシェルでしか使えません。なので、以下内容でgitリポジトリにhooks/buildというファイルを追加します。

hooks/build
#!/bin/bash

docker build -t $IMAGE_NAME --build-arg <環境変数名>=$<環境変数名> . 

サンプルプロジェクトでは、hooks/buildに以下内容を記載しました。

サンプルコード
#!/bin/bash

docker build -t $IMAGE_NAME --build-arg HOW_TO_PLAY_URL=$HOW_TO_PLAY_URL .

ちなみに複数環境変数を渡したい場合は、面倒臭いですが以下のように書きます。

環境変数複数指定
docker build -t $IMAGE_NAME --build-arg VAL1=$VAL1 --build-arg VAL2=$VAL2 --build-arg VAL3=$VAL3 .

ここから先は踏み込んだ説明なので、やり方だけ知りたいという方は読み飛ばしてください。hooks/buildはユーザ独自のDockerビルドコマンドを実行したい時に使うシェルです。Dockerビルドに環境変数を渡すやり方は色々あると思いますが、ここでは一般的な方法である--build-argを使っています。また、$IMAGE_NAMEはdockerhubが予め用意している環境変数名で、dockerイメージ名がセットされます。dockerhub公式サイトを見ると、これ以外にも様々な環境変数が事前定義されているようです。

3. ARG

以下のように、DockerfileにARGという項目を追加します。

Dockerfile
ARG 環境変数名

以下が、サンプルコードのDockerfileです。2行目に「ARG」という記載があります。

サンプルコード
FROM node:12.16.1-slim as builder
ARG HOW_TO_PLAY_URL
WORKDIR /usr/src/app
COPY . /usr/src/app/
RUN npm config set registry http://registry.npmjs.org/ && \
  npm ci && \
  npm run build:production

FROM node:12.16.1-slim as runner
WORKDIR /usr/src/app
COPY --from=builder /usr/src/app/ /usr/src/app/
CMD [ "npm", "run", "serve" ]
EXPOSE 3000

ちなみにですが、ARGとは--build-argで渡された環境変数をDockerfileで使えるようにするための命令です。なので--build-argだけを指定しも、環境変数の受け渡しはできません。