はじめに
Docker は Dockerfile というテキストファイルから命令を読み込んで、自動的にイメージをビルドしますねdocker build
を実行すると、順次コマンドライン命令を自動化した処理が行われて、ビルド結果となるイメージが得られます。
初心者がまず、dockerfileを記述するときのコマンドをまとめました。
FROM
ベースとなるDockerのimageを設定します。
FROM <image名>[:<tag>]
ubuntuベースの場合はこちら。:の後にtagを指定することもできます。
デフォルトはlatest
FROM ubuntu:latest
RUN
ビルド後にコンテナに対してLinaxのコマンドを実行する。
FROM ubuntu
RUN mkdir hoge_dir
RUN echo 'hogehoge' > hoge.txt
このように書くことで、できたコンテナ内にhoge_dirディレクトリを作り、hogeテキストファイルを作成し、hogehogeと書き込んでくれます。
ただ、注意しなければならないのは、RUNごとにlayerができてしまう点。一つのコマンドごとにRUNを指定しているとlayerが積み重なってdocker imageが重くなってしまうので
FROM ubuntu
RUN mkdir hoge_dir && echo 'hogehoge' > hoge.txt
&&
でつなぎましょう。
CMD
大抵はDockerfileの最後に記述してあり、こちらもデフォルトのLinaxコマンドを設定するという意味では、RUN
と似たようなものです。
ただ、CMD
はlayerを作らないという違いがあります。
どうやって使い分ければ良いのかと言えば、自分はざっくりとRUN
は残しておきたいものでCMD
はそうじゃないものに使うという認識でいいのかなと思ってます。
RUN apt-get update
CMD ["/bin/bash"]
上の場合は一度ビルドしてupdateしたら、二度同じことすると時間がかかるので、layerに残して置きたいですよね。
逆に下の場合はbash使うよという指示だけなんで、layerに残す必要はないです。
また、似たものでENTRYPOINTというものもあります。
CMDは設定したコマンドをrunの時に上書きできてしまいますので、そういった場合はENTRYPOINTで設定しましょう。
COPYとADD
どちらもローカルからコンテナにファイルをコピーできるものです。
ADD
の方ができることが多いです。
COPY <src> <dist>
ADD <src> <dist>
公式でも基本はCOPYを使うことを推奨しています。
コピー元がファイルでtar形式なんかだとADDが勝手に展開してくれます。
自分はADDは大きなファイルを圧縮してコンテナに持っていきたい時に使っています。
WORKDIR
コンテナ内での実行ディレクトリを変更してくれるものです。例えばdockerfileに
RUN mkdir test && cd test
RUN touch hoge.txt
としてもhoge.txtはroot直下に作られてしまいます。まあ &&
で繋げればいい話なんですけど、それじゃdockerfileに書き足していくときに毎回移動しないといけないんでWORKDIRを使うみたいです。
WORKDIR <絶対パス>
絶対パスにしてくださいね。
ENV
ENVは環境変数の設定をしてくれます。
ENV <key> <value>
例えば自分はENV PATH /anaconda3/bin:$PATH
のようにPythonのPATHを通すときに使いました。
最後に
自分がとりあえず必要になって触れたコマンドをまとめてみました。
ENTRYPOINTとかLABELとかは必要になってからでいいかなあ。