Dockerfileの作成とimage build!
Dockerfileの作り方(Rails環境)
Dockerfileに書くこと
・ベースイメージの指定
・必要なパッケージのインストール
・作業ディレクトリの指定
・Gemfile/Gemfile.lockのCOPY
・bundle installの実行
・CMDコマンドでの起動
Dockerfileでよく使うコマンド
FROM
→DockerHubからベースとなるイメージを探し、バーションを指定する。例えば、Railaアプリであればruby:2.5.7
とかOSであればubuntu:18.04
など。
RUN
→image builde時に実行するコマンドを指定する。このRUNコマンドには、実行結果をレイヤーとして確定するという特徴があるので、あるパッケージをインストールするためだけに必要なパッケージなどを無駄にイメージに含ませないためにも複数のコマンドを続けて書き、不要なパッケージは削除するコマンドを最後につけるなどして長くなることが大半です。
WORKDIR
→引数に絶対パスを指定して、それ以降のコマンドをその指定した作業ディレクトリ配下で実行することができる。
COPY [コピー元のパス] [コピー先のパス]
→第一引数に、コンテナにコピーしたいホストマシン上のパスを指定して、第二引数にコンテン上の保存先のパスを指定することで、コンテナ上にファイルがコピーされる。
CMD
→docker run
などでコンテナを起動するときに、ポートの指定やIPアドレスの指定などデフォルトで実行したいオプションなどをこのCMDコマンドを使って記述することで、その内容がデフォルト命令になる。
実際のDockerfile
FROM ruby:2.5.7
# ベースイメージの指定
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs default-mysql-client vim
# 必要なパッケージのインストール(ここが一番変数が多いと思います)
RUN mkdir /app
WORKDIR /app
# 今いるディレクトリの配下にappディレクトリを作成し、appディレクトリをworkdirで作業ディレクトリにし、これ以降の作業をapp配下で行うようにする
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
# ホストマシンの Gemfile と Gemfile.lock をコンテナ内のapp配下にコピー
RUN bundle install
# コンテナ内にコピーした Gemfile の bundle install
CMD [ "rails", "server", "-b", "0.0.0.0", "-p", "8080" ]
# デフォルト命令の指定
image buildeについて
→最後に、docker run
コマンドを実行したときに発生するエラーについて大きく二つ考え方があることを説明する。
①Dockerの操作や状態、起動コマンドに不備がある場合
②イメージや命令に不備がある場合
docker run
によるコンテナの起動には上記の2点が考えられる。
①は納得がいくが、②に関しては納得がいかない人もいるのではないでしょうか?
これは、image buileの仕組みにも関係している。
image buildeでは、イメージが悪い場合でもimage buildeが失敗するとは限らないのである。
これは、イメージそのものはただの情報の塊であり、そこに含まれる設定ファイルは正しいかの検証を受けていない。
つまり、image builde
を実行して問題なくイメージが作成せれていても実は、正しくなくdocker run
が正常に行われなかったということもある。
Discussion