Dockerhubのオートビルドでは、プロジェクト固有の環境変数を使うことができます。ただ、設定が結大変だったので、忘備録も兼ねてまとめます。オートビルドで環境変数を使うために必要な工程は、以下の3つです。
- BUILD ENVIRONMENT VARIABLES
- hooks/build
- 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
というファイルを追加します。
#!/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
という項目を追加します。
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
だけを指定しも、環境変数の受け渡しはできません。