web-dev-qa-db-ja.com

docker-compose.ymlのみを使用してデータコンテナーを作成するにはどうすればよいですか?

この質問は、Dockerのリポジトリに関する問題から生じています。
https://github.com/docker/compose/issues/942

Docker composeを使用してデータコンテナー(プロセスを実行しない)を作成する方法がわかりません。

30
ivan

正確にどのように行うかは、データ専用コンテナーに使用しているイメージに少し依存します。画像にentrypointがある場合、docker-compose.ymlでこれを上書きする必要があります。たとえば、これは、Dockerハブからの公式MySqlイメージのソリューションです。

DatabaseData:
  image: mysql:5.6.25
  entrypoint: /bin/bash

DatabaseServer:
  image: mysql:5.6.25
  volumes_from:
    - DatabaseData
  environment:
    MYSQL_ROOT_PASSWORD: blabla

これに対してdocker-compose upを実行すると、..._DatabaseData_1を呼び出すときにExitedのステータスを示すdocker ps -aのようなコンテナを取得します。 docker inspectでさらに調査すると、0のタイムスタンプがあることがわかります。これは、コンテナが実行されなかったことを意味します。 docker composeの所有者が述べているように here

これで、docker-compose rm -vを実行しない限り、データのみのコンテナー(..._DatabaseData_1)はデータを失いません。したがって、docker-compose stopおよびdocker-compose upを好きなだけ実行できます。

tianon/trueのような専用のデータ専用イメージを使用する場合、これは同じように機能します。ここでは、entrypointが存在しないため、上書きする必要はありません。その画像とdocker composeに問題があるようです。試していませんが、問題が発生した場合は この記事 を読む価値があります。

一般に、アクセスするコンテナに使用しているデータ専用コンテナに同じイメージを使用することをお勧めします。詳細については、 Data-only container madness をご覧ください。

25
Jan Suchotzki

データ専用コンテナー(DOC)は、ボリュームプロバイダーとしてのみ機能するように作成されたコンテナーです。コンテナ自体には、他のコンテナがvolumes_fromディレクティブを使用してボリュームをマウントできること以外の機能はありません。

DOCは、ボリュームを作成するために1回だけ実行する必要があります。他のコンテナは、停止している場合でも、その中のボリュームを参照できます。

OPの質問:docker-compose.ymlは、docker-compose upを実行するたびにDOCを開始します。OPはコンテナーとボリュームのみを作成し、実行しないオプションを要求します。何らかのcreate_only: trueオプションを使用します。

OPの質問からの問題で言及したように:

  • docker-compose.ymlで指定されたものと同じ名前でデータコンテナを作成し、docker-compose up --no-recreateを実行します(docker-compose.ymlで指定されたものは再作成されません)。
  • または、戻ることのない単純なコマンドでコンテナを実行します。
    同様:tail -f /dev/null
0
VonC