概要
dokcerfileのコマンドについて調べたことをまとめる
コマンド各種
FROM
ベースイメージとなるdockerImageを指定する
DockerHubのイメージを指定するのが一般的
FROM php:8.0-fpm-alpine
ENV
docker内に環境変数を設置する
ENV LANG ja_JP.UTF-8
COPY
ホスト側のファイル・ディレクトリを
コンテナ側へコピーする
COPY . /app
WORKDIR
Dockerfileでコマンドを実行する際に基準となるディレクトリを設定
存在しないディレクトリを指定するとディレクトリが作成される
デフォルトは /
WORKDIR /app
RUN
Docker内でコマンドを実行する
この時複数ある場合は連続して実行すると
中間イメージというものが作成されず、イメージサイズを小さくすることができる。
RUN apk update && \
apk add --no-cache --virtual .php-builds oniguruma-dev postgresql-dev nodejs npm git curl zip unzip && \
npm install npm@latest -g
USER
コンテナにログインするユーザーを指定する
デフォルトはroot
USER app
CMD
コンテナ起動時にデフォルトで実行されるコマンドを設定する
コンテナはここで設定したコマンドがフォアグラウントで実行されている間が生存期間となる。
バックグラウンドで実行するとコンテナプロセスが終了する。
そのためフォアグラウンドで実行するように設定する。
CMD ["npm", "run", "start"]
EXPOSE
コンテナ起動時に公開するポート番号を指定する。
EXPOSE 80
ホスト側とコンテナのポートを紐付けは
$ docker run -p 80:80
VOLUME
Data Volumeを作成する
build時にボリュームが作成される。
VOLUME ["/app"]
AWS ECSの場合の挙動
タスク実行時にDockerfileのファイルをデータボリュームに公開するために、
AmazonECSデータプレーンがVOLUMEディレクトリを探します。VOLUMEディレクティブで指定された絶対バスが、タスク定義で指定されたcontainerPathを同じである場合、VOLUMEディレクティブパス内のデータがデータボリュームにコピーされる。次のDockerfileの例では、/var/log/exportディレクトリにあるexamplefileという名前のファイルがホストに書き込まれ、その後コンテナ内にマウントされる。
FROM public.ecr.aws/amazonlinux/amazonlinux:latest
RUN mkdir -p /var/log/exported
RUN touch /var/log/exported/examplefile
VOLUME ["/var/log/exported"]
ENTRYPOINT
指定されたコマンドを実行する
CMDと違うのはdocker run 時に指定した引数を渡すことができる
ENTRYPOINT ["echo"]
$ docker run <IMAGE NAME> "hogehoge"
hogehoge
dockerImage
コンテナイメージはdockerfileの1行ごとがレイアーとなっている。
イメージとしてはスナップショットという感じでしょうか?
$ docker history イメージ名
IMAGE CREATED CREATED BY SIZE COMMENT
6af75be42b5f 6 hours ago WORKDIR /app 0B buildkit.dockerfile.v0
<missing> 6 hours ago COPY /usr/bin/composer /usr/bin/composer # b… 2.81MB buildkit.dockerfile.v0
<missing> 6 hours ago COPY ./sample /app # buildkit 48.1MB buildkit.dockerfile.v0
<missing> 9 days ago RUN /bin/sh -c docker-php-ext-install mbstri… 2.18MB buildkit.dockerfile.v0
<missing> 9 days ago RUN /bin/sh -c apk update && apk add --n… 386MB buildkit.dockerfile.v0
<missing> 9 days ago ENV COMPOSER_NO_INTERACTION=1 0B buildkit.dockerfile.v0
こんな感じでレイアーを確認することができる。
参考