こんにちは!kossyです!
さて、今回はDockerfileでよく使うコマンドをまとめてみたいと思います。
FROM
https://docs.docker.jp/engine/reference/builder.html#id43
ビルドするイメージのベースイメージを指定します。取得するイメージはDocker Hubのパブリックレジストリから取得されます。
FROM ruby:2.6
FROM node
のように指定することでイメージを指定できます。
ruby:2.6のように:の後の数字はタグと呼ばれるもので、特に指定しない場合はlatestタグが付されたイメージが取得されます。
RUN
https://docs.docker.jp/engine/reference/builder.html#id45
イメージをビルドする際、コンテナで実行するコマンドを定義するものです。
FROM ruby:2.6 RUN mkdir /myapp
RUNを記述した後に、linuxコマンド等を割り当てることで、コンテナ内で実行されるようになります。
COPY
https://docs.docker.jp/engine/reference/builder.html#copy
ホスト側からコンテナ側にファイルやディレクトリをコピーしたい時に使います。
FROM ruby:2.6 RUN mkdir /myapp COPY Gemfile /myapp/Gemfile
srcにはワイルドカードも指定することできます。
FROM ruby:2.6 RUN mkdir /myapp COPY Gem* /myapp
Gem*はGemから始まる名前が付けられたファイル全てを追加するのを想定しています。
Railsの場合だとGemfileとGemfile.lockが追加されると思います。
ADD
https://docs.docker.jp/engine/reference/builder.html#add
COPYの機能に加えて、アーカイブの自動展開やURLを指定してファイル・ディレクトリをコンテナに追加。
OSのベースイメージ作成時のような特殊なケースで活用されます。
FROM alpine # Auto unarchive ADD add.txt.gz /tmp # Can ADD from remote ADD https://github.com/github/fetch/blob/master/README.md /tmp 出典: https://qiita.com/YumaInaura/items/1647e509f83462a37494
COPYとの違いは以下の点があります。
・リモートサーバーからもファイルを追加できる
・圧縮ファイルが自動解凍される
こちらの記事によると、ADDよりもCOPYコマンドを使った方がいいとのことです。(公式もその見解らしい)
CMD
https://docs.docker.jp/engine/reference/builder.html#cmd
コンテナがフォアグラウンドで実行するコマンドを定義できます。
FROM ruby:2.6.5 RUN apt-get update -qq && apt-get install -y nodejs postgresql-client RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install COPY . /myapp COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 CMD ["rails", "server", "-b", "0.0.0.0"] 出典: https://qiita.com/kodai_0122/items/795438d738386c2c1966
Dockerfile内ではCMDコマンドは1つしか記述できません。
2つ目のCMDコマンドを記述した場合、1つ目のCMDコマンドは無視され、2つ目のものしか実行されないので注意してください。
ENTRYPOINT
https://docs.docker.jp/engine/reference/builder.html#entrypoint
コンテナを実行可能ファイルとして使用する際に定義するコマンドで、
CMDとENTRYPOINTは併用可能です。
FROM ruby:2.6 ENTRYPOINT ["ruby"] CMD [""]
この状態のDockerfileをbuildして実行すると、
docker image build -t test/ruby2.6
docker container run -it test/ruby2.6 version
のように、rubyコマンドを省略して実行することができます。
ARG
https://docs.docker.jp/engine/reference/builder.html#arg
docker image build に利用する変数を設定できます。
イメージビルド時のみ使用できる一時的な環境変数です。
Rails向けのDockerfileだと思ってください ARG RAILS_MASTER_KEY ENV RAILS_MASTER_KEY ${RAILS_MASTER_KEY}
docker build --build-arg RAILS_MASTER_KEY=${RAILS_MASTER_KEY} ...
上記のようにmaster.keyを環境変数として渡すことで、動的にmaster.keyを渡すことができます。
出典: https://qiita.com/hiko1129/items/c0a27ce0c46fcaeaac7b
ENV
https://docs.docker.jp/engine/reference/builder.html#env
コンテナ内に環境変数を定義するために用いられます。
ARG RAILS_MASTER_KEY ENV RAILS_MASTER_KEY ${RAILS_MASTER_KEY}
ENVを用いて設定された環境変数は、そのイメージから実行されたコンテナであれば維持され、
コンテナ内部で使用することができます。
上記の例では、コンテナ内でmaster.keyを参照できるようにENVで環境変数化しています。
参考にさせていただいた記事・書籍
https://docs.docker.jp/engine/reference/builder.html
https://qiita.com/YumaInaura/items/1647e509f83462a37494
https://qiita.com/momotaro98/items/bf34eef176cc2bdb6892
https://qiita.com/kodai_0122/items/795438d738386c2c1966
https://qiita.com/nacika_ins/items/cf8ceb20711bd077f770#env%E3%81%A8%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91