前置き:Dockerイメージ作成時の引数指定
以下のように--build-arg
オプションを使うことで指定可能。
$ docker build . -t [イメージ名] \
--build-arg KEY1=value1 --build-arg KEY2=value2
上記コマンドの指定は、Dockerfile内でARG KEY1=value1
のように指定するのと同じ意味になる。用途によっては、KEYのみ指定でvalueはなくてもOK。
課題
引数が大量にある場合にdocker build
のコマンドが長くなってしまうので、別途ファイルで管理したくなってくる。そこで例えば、--build-arg
を以下のようにファイルで指定する方法はないだろうか。
※[注意]下記コマンドは筆者の「妄想」なので、実行するとエラーになります
$ docker build . -t [イメージ名] \
--build-arg-file "docker.env"
調べてみたが、残念ながら本稿執筆時点では上のようなオプションは用意されていないみたい。
解決法
StackOverflowの以下記事
https://stackoverflow.com/questions/57091385/how-to-pass-argument-to-dockerfile-from-a-file
にあるように、現状はLinuxのコマンドを駆使してパイプでつないで実現する。
$ docker build . -t [イメージ名] \
$(cat docker.env | sed 's/^/--build-arg /g' | paste -s -d " ")
docker.env
の中身は以下のような感じ
KEY1=value1
KEY2=value2
KEY3=value3
今回のメインコマンド
$ cat docker.env | sed 's/^/--build-arg /g' | paste -s -d " "
(出力結果)
--build-arg KEY1=value1 --build-arg KEY2=value2 --build-arg KEY3=value3
について、ご参考に説明。
- sed
-
docker.env
の各行の先頭に--build-arg
を足す。
-
- paste
-
-s
(--serial)オプションで1行の文字列にする。 -
-d " "
で入力文字列をスペースで区切る指定をしている。指定しないと余計な空白ができたりするので、一応指定した方がよさそう。
-
補足
docker run
でコンテナ起動する場合は、--env-file
オプションで環境変数をファイルで指定可能。コンテナ起動と比較して、イメージビルド時に引数を大量に指定するケースはあまり無いから用意されていないのかもしれない。