Dockerfileの変数に関して
毎回忘れちゃうので備忘録
ARG
Dockerfile内で使用できる変数として利用できる
docker-compose v2より、docker-compose.yml内でargsを利用でき、docker-compose.ymlで具体的な値を設定、Dockerfileで利用する的なことができる
- Dockerfile
ARG NODE_VER
ARG RUBY_VER
ARG YARN_VER
- docker-compose.yml
web:
build:
context: .
dockerfile: Dockerfile
args:
NODE_VER: "12"
RUBY_VER: "2.6.6"
YARN_VER: "v1.22.15"
BUNDLE_VER: "2.3.5"
FROM
作成するコンテナのベースとなるイメージを指定する
- Dockerfile
FROM ruby:${RUBY_VER} //${ARGで設定している変数が利用できる}
EXPOSE
公開するコンテナのポートを指定する
- Dockerfile
EXPOSE 80
RUN
イメージを作成する際、実行したいコマンドなどを記載できる
複数指定する場合は「&&」が推奨されている
- Dockerfile
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - && apt-get install -y nodejs
RUN apt-get install -y libjpeg62 libpng-dev libxrender-dev libfontconfig1-dev libxext-dev fonts-ipafont-gothic
RUN npm install --global yarn
CMD
コンテナ起動時に実行するコマンドとオプションを変更できる
原則は末尾に記載する
コンテナを実行したときに”デフォルトで”実行されるコマンド
ENTRYPOINTも指定されている場合は、ENTRYPOINTの引数として渡される
- Dockerfile
# CMD ["実行コマンド", "オプション1", "オプション2"...]
# 記載例
CMD ["ls", "-a"]
ENTRYPOINT
コンテナ起動時に実行するコマンドとオプションを変更できる
原則は末尾に記載する
コンテナを実行したときに”必ず”実行されるコマンド
- Dockerfile
# ENTRYPOINT ["実行コマンド", "オプション1", "オプション2"...]
# 記載例
ENTRYPOINT ["ping","127.0.0.1","-c","100"]
WORKDIR
操作するディレクトリの絶対パス(推奨)を指定する
以降はそのディレクトリを基準にDockerfileに書いた操作が実行される
- Dockerfile
# WORKDIR 絶対パス
# 記載例
WORKDIR /opt
今まで書いてきたDockerfile
ENV
環境変数の設定できる
- Dockerfile
# ENV 環境変数名=値
# 記載例
ENV DB_USER="user" \
DB_PASSWORD="password" \
DB_DATABASE="sample_db"
COPY
明示的なコピー元とコピー先のファイルまたはディレクトリを指定して、ローカルファイルを再帰的にコピーする
COPYでは、場所を宣言する必要がある
COPYはソース側のマシンにあるものをImageへコピーするだけというシンプルな機能
- Dockerfile
COPY ./file.conf /etc/conf
ADD
ローカルファイルを再帰的にコピーし、存在しない場合は暗黙的にコピー先ディレクトリを作成し、アーカイブをコピー元としてローカルURLまたはリモートURLとして受け入れる
アーカイブはそれぞれコピー先ディレクトリに展開またはダウンロードされる
ADDは対象が圧縮ファイルであればそれを展開してImageへ移し、リモート上のリソースも引っ張ってくる機能がついている
- Dockerfile
ADD ./file.tar /etc/conf
ADDのリスク
- リモート上のリソースを自動で取りに行くのでダウンロード中、中間者攻撃の対象となりえる
- 圧縮ファイルを自動で展開するので、ZIP爆弾やZIP SLIP脆弱性攻撃の対象となりえる
※使い分けとしては容量が大きいファイル等をtarで圧縮した場合はADDでコピー、それ以外はCOPYといった感じ
参考記事
https://docs.docker.jp/engine/reference/builder.html
https://alterbo.jp/blog/ryu2-2106/
https://qiita.com/momotaro98/items/bf34eef176cc2bdb6892
https://qiita.com/soushiy/items/0945bcbc7ecce4822985
https://penpen-dev.com/blog/docker-cmd-entrypoin/