2つ目の例として、dateコマンドを実行するDockerコンテナを作成してみます。
以前紹介したように、dateコマンドは、日付を表示するとすぐにコマンドが終了してしまいますので、Dockerコンテナでdateコマンドを実行すると、Dockerコンテナ自体もすぐに終了してしまいます。そのためにdateコマンドの結果を確認しようとしても、Dockerコンテナが終了しているため、結果を確認できないということになってしまいます。
そこで、Dockerでは、すぐに終了するコマンドにtailコマンドを組み合わせたスクリプトを用意します。無限に実行し続けるスクリプトをDockerコンテナで実行するのです。この無限に実行するスクリプトをDockerfileでどのように記述するかをみてみましょう。まずは、作業用ディレクトリ/root/c66date0001を作成し、Dockerfileを以下のように記述します。
# mkdir /root/c66date0001 # cd /root/c66date0001 # vi Dockerfile FROM centos:centos6.6 ADD date.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/date.sh ENTRYPOINT ["/usr/local/bin/date.sh"]
Dockerfileでは、ADD行で、Dockerイメージに含めたいファイルを指定することができます。上記は、ホストOS上に作成したdate.shスクリプトを、Dockerイメージの/usr/local/binディレクトリにコピーするという意味になります。
RUN行では、Dockerイメージにコピーしたdate.shスクリプトに実行権限を付与しています。最後のENTRYPOINTは、Dockerコンテナ実行時に起動させたいコマンドを指定しています。ここでは、Dockerコンテナ起動時に/usr/local/bin/date.shスクリプトを実行するという意味になります。無限に終了しないスクリプトdate.shをDockerfileと同じ作業ディレクトリ内で作成します。
# pwd /root/c66date0001 # vi date.sh #!/bin/sh date > /var/log/date.log tail -f /dev/null
Dockerfileとdate.shが作成できたら、Dockerイメージを作成してみましょう。
# pwd /root/c66date0001 # docker build -t centos:c66date0001 . ... # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos c66date0001 0c9d21c2ca74 3 minutes ago 202.6 MB centos centos6.6 8b44529354f3 4 months ago 202.6 MB
Dockerイメージcentos:c66date0001がビルドできたら、Dockerコンテナ「date0001」を起動してみます。
# docker run -i -t -d --name date0001 centos:c66date0001
起動したDockerコンテナ「date0001」が(すぐに終了せずに)稼働し続けているかどうかを確認します。
# docker ps -a CONTAINER ID IMAGE COMMAND ... STATUS ... NAMES 53796eee0644 centos:c66date0001 "/usr/local/bin/date ... Up 4 minutes ... date0001
docker ps -aの出力で、Dockerコンテナ「date0001」のSTATUSの項目が、「Up ...」となり、稼働し続けていることが分かります。これにより、Dockerコンテナ「date0001」で、dateコマンドが出力したログ/var/log/date.logにアクセスすることができますので、早速ホストOSから、Dockerコンテナで実行されたdateコマンドのログを見てみましょう。
# docker exec -i -t date0001 cat /var/log/date.log Wed Aug 26 12:24:46 UTC 2015
このように、Dockerfileでは、無限に終了しないスクリプトを埋め込むことが少なくありません。無限に終了しないスクリプトを埋め込むというと、Dockerにおける特有のクセのように感じてなんだか気持ちが悪いという方もいて、慣れるまでとっつきにくいイメージはあるかもしれません。しかし、様々なアプリケーションをビルドしてみると、徐々に勘所がわかってきます。最初は簡単なコマンドを実行するだけのDockerfileを作って、Dockerfileの文法と挙動を覚えるようにしてください。ある程度文法を知り、挙動が理解できたら、徐々に複雑なアプリケーションを含んだDockerイメージの自動構築に挑戦してみましょう。
Copyright © ITmedia, Inc. All Rights Reserved.