LoginSignup
2
1

More than 3 years have passed since last update.

【入門】Dockerfileを記述するときの最低限知識

Last updated at Posted at 2020-07-09

はじめに

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とかは必要になってからでいいかなあ。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1