第9回 Dockerfileで“インフラストラクチャ・アズ・コード”を体験古賀政純の「攻めのITのためのDocker塾」(3/4 ページ)

» 2015年09月30日 08時00分 公開

dateコマンドを実行するDockerコンテナ用のDockerfileを作成してみる

 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イメージの自動構築に挑戦してみましょう。

photo Dockerfileを使ったビルド。キャッシュを使ってビルド時間を大幅に短縮できる

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ