プログラミング学習記録#16 Dockerfile②
Dockerfile記法
●COPY
ホスト(ローカル)のファイルやディレクトリをDockerイメージにコピーする
COPY <コピー元> <コピー先>
ex}
COPY index.html / mydir/index.html # ファイルをファイルに
COPY index.html /mydir/ # ファイルをディレクトリに
COPY src/ /mydir/ # ディレクトリをディレクトリに
・コピー先は絶対パスか、DORKDIR(作業ディレクトリ)からの相対パス
・ソースコードや設定ファイルをローカルで作成して、COPYを使ってDockerイメージにコピーして使用する
・似たようなインストラクションにADDがあるがCOPYを使用することが推奨されている
●ENV
環境変数を設定する
ENV <キー>=<値>
ex)
ENV MYSQL_USER=admin
ENV MY_NAME=“Taro Yamada”
・Dockerfileの中でその値を使いまわしたり、イメージに値が渡されるので作成されたコンテナの中で環境変数の値を使うことができる
●WORKDIR
コマンドを実行する作業ディレクトリを指定する
WORKDIR <ディレクトリのパス>
ex)
WORKDIR /app
WORKDIRを設定しておくとRUNの際にcdコマンドを使わなくて良くなり読みやすくトラブルも起きにくくなる
●ENTRYPOINT
コマンド実行時に実行したいコマンドを指定する
ENTRYPOINT [“実行ファイル”, “パラメータ1”, “パラメーター2”]
ex)
ENTRYPOINT [“apachectl”, “-D”, “FOREGROUND”]
・役割としてはCMDによく似ている
○CMDとENTORYPOINT
共通点
・コンテナ実行時に実行される
・docker container run 実行時に引数を渡すとコマンドを上書きできる
違い
・CMD : docker container時の引数でCMD[”command”]のcommand部分を上書きして実行する
・ENTRYPOINT: docker container時の引数がENTRYPOINT[“command”]のcommandの引数として実行される
・併用した場合
CMDに書かれている場合はCMDに書かれている内容がENTRYPOINTに書いてあるcommandのオプションとして実行される
Dockerfile作成時のベストプラクティス
●ビルドコンテキストを理解する
ビルドコンテキスト:docker build時のワーキングディレクトリのこと
Dockerfileとビルドコンテキスト以下のファイルを使ってビルドする
●.dockerignoreファイルを使う
Dockerのビルド時に無視するファイル/ディレクトリを指定できる
・コンテナ内に不要な情報やイメージのビルド時に追加されるファイルは.dockerignoreで無視
・ビルド時間を短縮できる
●コンテナ毎に一つのプロセスだけを実行する
・1つのコンテナの中では一つのプロセスだけを実行する
メリット
・コンテナの再利用がしやすくなる
○イメージのサイズはできる限り小さくする
イメージのサイズが小さいほどディスク容量を圧迫せずに配布も楽にできる
・不要なパッケージをインストールしない
必須でないパッケージはインストールしない
ベースイメージを小さいものにする
・RUNをまとめる
RUN実行の度にイメージのレイヤーが作成され、キャッシュに利用される
レイヤーを作るほどイメージサイズが大きくなる
1つのRUNの中で&&で繋げると余計なレイヤーが作られない