はじめに
Dockerfileを書く際に、CMDとRUNの挙動について調べたので、そのことについてまとめていく。
CMD
-
CMD の主な目的は、コンテナ実行時のデフォルト(初期設定)を指定するためです
と公式ドキュメントにあるように、CMDはコンテナが作成されるときに実行される。 - ということは、イメージを作成するビルド時に実行されないと思われるので試してみた。
試してみた
- Dockerfileの最後にCMDでWebサーバーを起動するコマンドを書いた際の挙動をみてみる。
- 以下、Dockerfileのみ抜粋。
- 他の構成ファイルはGithubを参照。
FROM node:12.22.1-alpine
WORKDIR /app
COPY ./src/package.json ./src/yarn.lock ./src/server.js ./
RUN yarn install
# コンテナ作成後にコマンド実行
CMD [ "node", "server.js" ]
1.Dockerfileをビルド
2.コンテナを起動
結果
Webサーバーが起動していることから、コンテナ作成時にCMDで書いたコマンド[ "node", "server.js" ]
が実行されたことが分かる。
RUN
-
RUN 命令は、現在のイメージよりも上にある新しいレイヤでコマンドを実行し、その結果を コミット(確定)commit します
と公式ドキュメントにあるように、RUNはビルド時に実行される。 - ということは、ビルド時に実行されると思われるので試してみた。
試してみた
- Dockerfileの最後にRUNでWebサーバーを起動するコマンドを書いた際の挙動をみてみる。
- 以下、Dockerfileのみ抜粋。
- 他の構成ファイルはGithubを参照。
※Dockerfileの最後は以下のように変更すること。
FROM node:12.22.1-alpine
WORKDIR /app
COPY ./src/package.json ./src/yarn.lock ./src/server.js ./
RUN yarn install
# ビルド後にコマンド実行
RUN node server.js
1.Dockerfileをビルド
-
node server.js
が実行されているのがみえる。
結果
イメージのビルド時にRUNで書いたコマンドnode server.js
が実行されていることが分かった。