環境設定
環境変数の設定
Linuxサーバなどを実際にたてる場合には環境変数を設定する必要がでてくると思います。
Dockerfileでの環境変数の設定はENV命令により実行します。
ENV NAME wantan
一つ目の引数の後のスペース以降は全て文字列として扱われるためスペースなどを含めたものも設定できます。
作業ディレクトリの指定
作業ディレクトリの指定にはWORKDIR命令を使用します。
ディレクトリを指定するだけなので、基本的に他の命令と組み合わせて使用します。
WORKDIR /tmp/work
また指定したディレクトリが存在しない場合には作成してくれるようです。
ユーザの指定
他のコマンドを実行するためにユーザを指定するためにはUSER命令を使用します。
コンテナの起動時まで引き継がれてしまうようなので、権限などに注意。
必要に応じて、rootユーザに戻しておく必要がある。
USER wantan
この命令は勝手にユーザを作成してくれるわけではないので別途ユーザを作成しておく必要があります。
・ユーザ作成の例
RUN ["adduser", "wantan"]
RUN命令の他にはCMD命令やENTRYPOINT命令を使用する際には使えます。
変数の設定
シェルスクリプト内で変数を扱うのと同じような方法でDockerfile内でも変数を扱うことができます。
Dockerfile内での変数設定はARG命令を使用します。
ARG USERNAME="wantan"
設定した変数を使用するには$(ドラー)を使用します。
・使用例
RUN echo $USERNAME
ポートの設定
コンテナの公開するポート番号を指定するにはEXPOSE命令を使用します。
コンテナをrunコマンドで起動する-pオプションと同様です。
EXPOSE 8080
命令の検証確認
作成したDockerfile
以前に作成したDockerfileに今回学んだ命令を追記してみました。
・Dockerfileファイル
# ベースイメージの取得 FROM centos # nginxのインストール RUN yum -y install nginx # ビルド後のINDEXファイルの配置 ONBUILD ADD index.html /usr/share/nginx/html # 変数の設定 ARG USERNAME="wantan" # ユーザの作成 RUN useradd -m $USERNAME # 作業ディレクトリの指定 WORKDIR /tmp/work # 権限を変える RUN ["chown", "wantan:wantan", "/tmp/work/"] # ユーザの指定 USER $USERNAME # ファイルの作成 RUN ["touch", "test.txt"] # ユーザを戻す USER root # 環境変数の設定 ENV NAME wantan # ポートの設定 EXPOSE 80 # デーモン実行 ENTRYPOINT ["nginx", "-g", "daemon off;"]
実行と確認
・Dockerfileの実行
docker build -t testos:1.0 /home/ec2-user/docker_work
・コンテナの起動
コンテナの起動はバックグラウンドで行います。
docker container run -d --name webserver -p 8080:80 testos:1.0
・コンテナへ接続
docker container exec -it webserver /bin/bash
・接続後の確認
コンテナの接続を行うと作業ディレクトリが作成され、カレントディレクトリも作業ディレクトリになっていることが分かります。
また切り替えたユーザでファイルを作成しているため、所有者が切り替え後のユーザになっています。
[root@598663001a72 work]# ls -l
total 0
- rw-r--r-- 1 wantan wantan 0 Mar 8 09:02 test.txt
・ブラウザ
最後にブラウザから確認。今回は前回のDockerfile2で作成したイメージではないので、nginxのデフォルト画面が表示されます。
ファイル操作
ファイルの追加
ホストからイメージへのファイル追加にはADD命令を使用します。
第一引数にはホストのファイル、第二引数にイメージ上のパスを記述します。
ADD index.html /usr/share/nginx/html
また、第一引数にリモートURLすればリモートファイルを配置することもできます。
ファイルのコピー
以前の記事から使用していますが、ファイルのコピーにはCOPY命令を使用します。
COPY index.html /usr/share/nginx/html
機能と構文を確認すると分かりますが、ADD命令とほぼ同様の命令です。
違いとしてはCOPYはリモートファイルに対応していないため、ホストからのファイルコピーだけになります。
なので、リモートファイルはADD、ホストからのファイルはCOPYなどで使い分ければいいでしょう。
ボリュームのマウント
イメージにボリュームを割り当てるには、VOLUME命令を使用します。
コンテナ側のパスを指定します。
VOLUME ["/var/log"]
永続データを扱う場合にはコンテナ上では不確実性もあるので、実運用する際には永続データはマウントしておいた方が無難であるようです。