Dockerイメージをpullした後にbashを起動して色々と手を加える(docker commitを使う)ことはできますが、あまりいい方法ではありません.
イメージファイルに手で加える修正が複雑になるともはやどのようにイメージが作られたのかわからなくなり、メンテナビリティが低下してしまいます.
特に、誰かのイメージを拡張して使っている場合、独自にcommitしていると、オリジナルのイメージに入った更新を取り込むには「オリジナルのイメージ再取得 -> 独自に行ったcommitを再度行う」といった操作が必要になってしまいます.
そこで、pullしたイメージはDockerfileを更新することによって拡張していくべきです.
1. Dockerfileの作成
まず、作成したいイメージ用のディレクトリを作成します.
ここでは、Apache Spark用のイメージ(sparkapps)を作成する例を示します.
1 2 3 |
$ mkdir sparkapps $ cd sparkapps $ touch Dockerfile |
Dockerfileというファイル名は変更しないでください.
ここから先の操作は、Dockerfileが存在しているディレクトリで行います.
1 |
$ vi Dockerfile |
ここでsequenceiqのSpark用Dockerfileの内容をDockerfileにコピペします.
内容は以下の通り.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
FROM sequenceiq/hadoop-docker:2.5.1 MAINTAINER SequenceIQ RUN curl -s http://d3kbcqa49mib13.cloudfront.net/spark-1.1.0-bin-hadoop2.4.tgz | tar -xz -C /usr/local/ RUN cd /usr/local && ln -s spark-1.1.0-bin-hadoop2.4 spark RUN mkdir /usr/local/spark/yarn-remote-client ADD yarn-remote-client /usr/local/spark/yarn-remote-client RUN $BOOTSTRAP && $HADOOP_PREFIX/bin/hadoop dfsadmin -safemode leave && $HADOOP_PREFIX/bin/hdfs dfs -put /usr/local/spark-1.1.0-bin-hadoop2.4/lib /spark ENV YARN_CONF_DIR $HADOOP_PREFIX/etc/hadoop ENV SPARK_JAR hdfs:///spark/spark-assembly-1.1.0-hadoop2.4.0.jar ENV SPARK_HOME /usr/local/spark #ENV HADOOP_USER_NAME hdfs ENV PATH $PATH:$SPARK_HOME/bin:$HADOOP_PREFIX/bin CMD ["/etc/bootstrap.sh", "-d"] |
2.ビルド
ここまでできれば、Dockerイメージをビルドできます.
* Spark用として紹介したDockerfileはビルド時にローカルファイルをADDしています.ビルド前に、yarn-remote-clientディレクトリを用意する必要があります.
1 |
$ docker build -t="myuser/sparkapps" . |
-t でイメージのタグ名を設定しています.必要に応じて変更してください.
ポイントは、一番最後のピリオド(.)です.現在のディレクトリにDockerfileが無い場合は失敗するので、ピリオドの代わりにDockerfileの存在するパスを指定します.
ビルドに必要なファイル一式はGit等で管理・シェアするのが主流のようです.
3.その他
dockerのイメージに直接手を入れすぎた場合、Dockerfileをどのように更新すればいいのかわからなくなるかと思います.
そのような場合は以下のコマンドが便利です.
- Dockerイメージのコミット履歴を見るコマンド
1 |
$ docker history <image> |
- イメージ上で行われた操作を見るコマンド
1 |
$ docker logs <container id> |