前回はDockerfileの記述方法、そしてDockerfile⇨Docker imageの作成方法について解説しました。
今回は、docker context(フォルダ)の中にある何かファイル等をDocker imageに組み込むことができるRUN,ADDの記述方法をみていきます。
また、よくごっちゃで理解してしまっているENTRYPOINTとCMDの違い、その他のインストラクションとしてENV, WORKDIRについて解説していきます。
Contents
ADDとCOPYの違いについて
$ COPY <src> <dest> : <src>を<dest>にコピーする
$ ADD <src> <dest> : <src>を<dest>にコピーする
⚠️COPYとADDの違い
✔️ファイルやフォルダをコピーするだけの場合はCOPY
✔️圧縮ファイル(tar)をコピーして解凍したい場合はADD
★COPYの例(/docker内にsamethingファイルを作り、Dockerfileのnew_dirにコピーする)
1 2 3 4 5 |
<~/Desktop/docker/Dockerfile> FROM ubuntu:latest RUN mkdir /new_dir COPY something /new_dir/ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<Command> [~] $ cd ~/Desktop/docker [~/Desktop/docker] $ touch something [~/Desktop/docker] $ ls >Dockerfile something [~/Desktop/docker] $ docker build . [~/Desktop/docker] $ docker ps -a >REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> d2b7ffe54888 30 seconds ago 72.9MB [~/Desktop/docker] $ docker run -it d2b7ffe54888 bash root@b90b63369b08:/# ls /new_dir >something |
★ADDの例(/docker内にcomperssed.tarファイルを作り、Docker buildにて解凍してimage内に保存する)
1 2 3 4 |
<~/Desktop/docker/Dockerfile> FROM ubuntu:latest ADD compressed.tar / |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<Command> [~] $ cd ~/Desktop/docker [~/Desktop/docker] $ mkdir sample_folder [~/Desktop/docker] $ cd sample_folder [~/Desktop/docker/sample_folder] $ echo 'hello' > hello (※helloというファイルの中にhelloと記述して保存) [~/Desktop/docker/sample_folder] $ cd .. [~/Desktop/docker] $ tar -cvf compressed.tar sample_folder a sample_folder/compressed.tar a sample_folder/hello [~/Desktop/docker] $ ls compressed.tar Dockerfile sample_folder # buildするタイミングでcompressed.tarファイルは解答される $ docker build . $ docker run it --rm <imageID> bash root@b90b63369b08:/# cd sample_folder/ && ls hello $ cat hello >hello |
ENTRYPOINT:上書き不可能なコマンドの設定
ENTRYPOINTの特徴
✅docker run時に上書きすることはできない(❌ dokcker run ubuntu ls : lsで上書きできない)
⇔ “CMD”は上書き可能
✅CMD[“executable”, “param1”, “param2”, …]
⇨ENTRYPOINT [“executable”] CMD [“param1”, “param2”, …]という形をとる
✅docker run時に上書きできるのはCMDの部分のみ
✅コンテナをコマンドみたいに使いたい時
1 2 3 4 5 |
『CMD』のみで書く場合(Dockerfile) FROM ubuntu:latest RUN touch test CMD ["ls", "--help"] |
1 2 3 4 5 6 |
『ENTRYPOINT』で書く場合(Dockerfile) FROM ubuntu:latest RUN touch test ENTRYPOINT ["ls"] CMD ["--help"] |
ENVについて:環境変数を設定
下記のどの書き方でも問題ないです(好みの問題)
特にこだわりがない場合は、ENV <key> <value> と書きましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<Dockerfile> FROM ubuntu:latest ENV key1 value ENV key2=value ENV key3="v a l u e" key4=v\ a\ l\ u\ e ENV key5 v a l u e <Command> [~] $ docker bulld -t <imageID> . <コンテナ内> root@<containerID>:/# env key4=v a l u e key5=v a l u e key2=value key3=v a l u e key1=value |
WORKDIRについて:Docker instructionの実行dirを変更する
どちらも/root直下にsample_folderを作成し、その中でsample_fileを作成しています。
書き方は、WORKDIR <絶対path> です。相対パスでもいいですが、分かりやすいよう絶対パスで書くようにしよう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
○Dockerfile<WORKDIR無しの書き方> FROM ubuntu:latest RUN mkdir sample_folder && \ cd sample_folder && \ touch sample_file ○Dockerfile<WORKDIR有りの書き方> FROM ubuntu:latest (RUN mkdir sample_folder) ←わざわざ書かなくてもsample_folderはできる WORKDIR /sample_folder RUN touch sample_file ⬇︎ docker bulld -t <imageID> . ○コンテナ内 root@<containerID>:/sample_folder# ls sample_file |
以上となります。Dockerfileにおける”ADD”と”COPY”、”CMD”と”ENTRYPOINT”の違いについての解説と、ENV、WORDIRコマンドについての解説をしましたが、いかがだったでしょうか?
次回はDockerfileがフォルダ内に複数ある場合、Dockerfileを指定してビルドする方法について解説して行きたいと思います。
今回はこの辺で、バイバイ👋
○プログラミング初心者
○Dockerの基礎の基礎部分を勉強したい人