Dockerfile:FROM, RUN COPY, ENV, WORKDIR, ENTRYPOINT

  • DSL:Docker独自の言語

Dockerfileに、インストラクション(命令)を書く。

Dockerfileの上から順に、実行されていく。

   * インストラクション:FROM, RUN, CMD, etc.

  • FROM

Dockerfile の一番上に記載する。
Dockerイメージのベースになるイメージを指定する。
指定するイメージは、Dockerhub に載っているものを使うのが通説。

  • RUN

Dockerイメージをビルドする時に、コンテナ内で実行するコマンドを書く。

  • COPY:COPY <ローカルfile or dir名> <コピー先>

ローカルホスト(自分のpc)で作ったソースコードをdockerイメージに送る。
COPY index.html /var/www/html/ :ローカルの index.html をdocker の /var/www/html/ 直下にコピペする という意味
因みに、「apache」 の仕様上、デフォルトでは/var/www/html/の直下にあるファイルを読み込むようになっている。

FROM ubuntu:22.10

RUN apt update \
  && apt install -y apache2

COPY index.html /var/www/html/

CMD [ "apachectl", "-DFOREGROUND" ]
  • ENV:環境変数:その OS 上の全てで使う変数。機密事項もここに書いたりする。

以下の例のように、APACHE_CONFDIR=/etc/apache2$APACHE_CONFDIRとして、変数として使える。

FROM ubuntu:22.10

ENV APACHE_CONFDIR=/etc/apache2
ENV APACHE_ENVVARS=$APACHE_CONFDIR/envvars

RUN apt update \...

コンテナ内で、確認もできる。

***コンテナ内

root@XXXXXXX:/# echo $APACHE_CONFDIR
/etc/apache2
root@dc1902b02536:/# echo $APACHE_ENVVARS
/etc/apache2/envvars

目的としては、$ docker container exec -it apache2 /bin/bashみたいに、コンテナの中で、作業をするときに、cd XXXコマンドで、ディレクトリの移動を減らすため。

FROM ubuntu:22.10

ENV APACHE_CONFDIR=/etc/apache2
ENV APACHE_ENVVARS=$APACHE_CONFDIR/envvars

WORKDIR /var/www/html <- ここ!

RUN apt update \...

因みに、WORKDIR /var/www/html を指定すると、以下みたいな状態になる。

% docker container exec -it apache2 /bin/bash
root@XXXXX:/var/www/html# pwd
/var/www/html

と、最初から今いるディレクトリを表してくれているかなと。root@XXXXX:/var/www/html#

  • ENTRYPOINT:必ず実行されるコマンド。CMDと近いが、違うところがある。

ほぼ同じ。
違いは、CMD は、上書きできるが、ENTRYPOINT は、上書きされない。
また、CMDとENTRYPOINT は、一緒に使えて、CMD が ENTRYPOINTの引数になる。

$ docker run 引数とできる。その際に
$ docker run bbb とすると、「bbb」が引数として追記される。
$ docker run bbb とすると、「bbb」に全て上書きされる。

例1:
Dockerfile の中身が、CMD [ "echo", "hoge" ] の場合

$ docker docker container run -d practice/apache2:latest echo test
test

上記のコマンドを実行すると、「echo test」に CMD が上書きされ、「test」が出力される。

しかし、

例2:
Dockerfile の中身が、ENTRYPOINT [ "echo", "hoge" ] の場合

$ docker container run -d practice/apache2:latest test
hoge test

上記のコマンドを実行すると、「test」が追加の引数となり、「hoge test」が出力される。

さらに、
例3:
Dockerfile の中身が、以下の場合

ENTRYPOINT [ "echo", "hoge" ] 
CMD ["addCMD"]

$ docker container run -d practice/apache2:latest
hoge addCMD

となる。

Dockerfile 作成手順

  1. ベースイメージを決める

  2. コンテナの中に入って、シェルを実行してみる

  3. 必要な作業をする

  4. Dockerfile に記載する

  5. イメージとコンテナを作り直す

2~5 を繰り返し行い、Dockerfile を作成していく