Dockerを使って以下のような動きができるコンテナを作成したいと思うことがありました。
- dockerイメージ のビルドの過程でファイルが生成される。
- 一部のファイルを外部からマウントして、コンテナ内部から参照できる。
- 起動したら何らかの処理を実行して終了する。
想定しているのは、開発用のdockerです。
imageのビルド時に必要なファイルの生成を行い、その後コンテナの外部にあるファイルを参照しつつ、dockerコンテナを起動し何らかのプロセスを実行します。
サンプルのdocker
サンプルとして以下のリポジトリを作成しました。
https://github.com/naokomada/batch_container
サンプルの実行方法
- https://github.com/naokomada/batch_container をcloneする。
docker-compose build
docker-compose up
サンプルの動作説明
データ保持と、処理実行について細かい動作を説明します。
主に以下のファイルについての説明となります。
-
Dockerfile
(サンプルで使用するファイルのコピーをしています。) -
docker-compose.yml
(volumes, commandの設定をしています。) -
batch_files/lsla.sh
(commandに指定して、作成したディレクトリの内容を表示するに使っています。)
docker のデータ保持について
サンプルの中では以下の4つのパターンでディレクトリを作成します。
- Dockerfileの処理中に作成(
dirdockerfile/
) - volumeとして作成(
dirvol/
) - 元々存在するディレクトリをbind(
dirbind/
) - 存在しないディレクトリをbind(
dirbind_after/
)
作成方法について、以下の内容が参考になります。
dockerのストレージについて
https://matsuand.github.io/docs.docker.jp.onthefly/storage/
それぞれ作成方法の違いにより、挙動が異なります。
- Dockerfileの処理中に作成(
dirdockerfile/
)- ボリュームとしてデータが保持されます。
- 匿名ボリュームになります。
- docker-compose down により削除されます。
- volumeとして作成(
dirvol/
)- ボリュームとしてデータが保持されます。
- サンプル中のdocker-compose.ymlの設定内容に基づいて名前つき(named)として作成されています。
- docker-compose down をしてもデータが維持されます。
- 元々存在するディレクトリをbind(
dirbind/
)- バインドマウントとしてデータが保持されます。
- docker-compose.ymlでsourceにした、ホストマシン上のディレクトリがdockerコンテナの内部から参照できます。
- ディレクトリの所有者や参照権限は、ホストマシン上で元々設定されていた内容が維持されます。
- 存在しないディレクトリをbind(
dirbind_after/
)- バインドマウントとしてデータが保持されます。
- docker-compose.ymlでsourceにした、ホストマシン上のディレクトリがdockerコンテナの起動時に生成されます。
- ディレクトリの所有者や参照権限は、root権限になります。
なお、以下のように使い分けできます。
- dockerコンテナの外部にあるファイルを編集し、dockerコンテナ内で起動するプロセスに渡して実行させたい場合
-
- の方式で実行すれば実現できます。
-
- dockerイメージの内部でファイルを作成・更新し、dockerコンテナ内で起動するプロセスに渡して実行させたい場合
-
- の方式で実現できます。また、複数コンテナでファイルを共有したいなら2.で対応できます。
-
4.のケースについては注意が必要だと思います。このケースの場合、dockerコンテナの動作時に生成されたファイルについて、権限設定が意図しない状態になり編集できなくなる可能性もあります。
dockerコンテナ起動時の動作
起動と同時に処理を実行したい場合
サンプル内では以下のように実行することで、docker-compose upで処理が行われます。
services:
batch_container:
command: sh ./lsla.sh
以下のように書き換えることで、docker-compose upでコンテナを起動後、シェルのAttatchをして処理をすることもできます。
または、docker-compose exec batch-container sh ./lsla.sh
のように実行できます。
services:
batch_container:
tty: true
command: sh -c "/bin/sh"