Docker-composeを使用していますが、サービスのビルドステップごとに異なるDockerfileを使用したいと思います。 docs は、さまざまなDockerfileをさまざまなディレクトリに配置することを提案しているようですが、それらすべてを同じディレクトリに配置したいと思います(おそらく、次の規則を使用して区別できます:Dockerfile.postgres、Dockerfile.main。 ..)。これは可能ですか?
編集:私が持っているシナリオには、このdocker-composeファイルが含まれています。
main:
build: .
volumes:
- .:/code
environment:
- DEBUG=true
postgresdb:
extends:
file: docker-compose.yml
service: main
build: utils/sql/
ports:
- "5432"
environment:
- DEBUG=true
ここで、postgresdb
のDockerfileは次のとおりです。
FROM postgres
# http://www.slideshare.net/tarkasteve/developerweek-2015-docker-tutorial
ADD make-db.sh /docker-entrypoint-initdb.d/
そしてメインは:
FROM python:2.7
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ADD . /code/
これは現在機能しますが、SQL Alchemyに基づいて構築されたモデルに従ってデータベースにテーブルを作成するPythonスクリプトを呼び出して、postgresdb
のDockerfileを拡張したいと思います(Pythonスクリプトはpython manage.py create_tables
)として呼び出されます。私はそれをdbのDockerfileに追加したかったのですが、コンテナーの分離のため、SQL Alchemyを使用できません。これは、そのイメージがPythonではなくpostgres
イメージに基づいており、それが含まれていないためです。 sqlalchemy
パッケージ...
私に何ができる? main
でpostgresdb
サービスを使用しようとしましたが、残念ながらpythonとそのパッケージを引き継がないため、次のような単一のDockerfileを書き込むことができませんPostgresデータベース(シェルスクリプトを使用)とそのテーブル(Pythonスクリプトを使用)を作成します。
Dockerがビルドコンテキストを処理する方法が原因で、これは不可能です。
thatサービスのDockerビルドコンテキストの一部になる各ディレクトリにDockerfile
を使用して配置する必要があります。
参照: Dockerfile
実際にはdocker-compose.yml
は次のようになります:
service1:
build: service1
service2:
build: service2
参照: docker-compose
更新:
あなたの特定のユースケースに対処するため-私があなたが何をしようとしているのか、そして私が個人的にこれを自分でしない理由を理解していますが。分離は良いことであり、期待と複雑さを管理するのに役立ちます。 「データベースの作成」は、アプリのソースコードに基づく別のコンテナとして、またはアプリコンテナ自体の中で実行します。
あるいは、 shutit (での経験はありませんが、神の異議を唱えた)など、よりスクリプト化されたテンプレート駆動型のソリューションを見ることができます。
FWIW:懸念の分離ftw :)
ビルドセクションに追加する必要があります。したがって、サービスごとに異なる代替dockerfileを指定できます。
services:
service1:
build:
context: .
args:
- NODE_ENV=local
dockerfile: Dockerfile_X
ports:
- "8765:8765"
ShutItの作成者はこちら。人々はそれについて良いことを聞いていると聞いて満足しました。
正直なところ、私はあなたの立場で独自のDockerfileを作成し、aptやyumなどの標準パッケージ管理を使用します。 ubuntuイメージとpython-pipおよびpython-sqlalchemyを使用した簡単なチェックは無料で利用できます。
ShutItを使用することで機能する可能性のある複雑な解決策が他にもあります。これについては少し話題から外れていると思いますので、オフラインで話し合ってください。 Shutkerはこのようなユースケース用に作成されました。これは、Dockerfileのマイクロサービススペース外のユーティリティが制限されていることを考えると、これが一般的な問題であることがわかったためです。
docker-compose.yml
でdockerfile
引数を使用して、特定のサービスの代替の引数を指定できます。
ディスカッションが古いため、いつ追加されたかはわかりませんが、リファレンスにあることがわかります https://docs.docker.com/compose/compose-file/#dockerfile
昨日試してみましたが、問題なく動作します。 Dockerfile
とDockerfile-service3
があり、docker-compose.yml
にある私のプロジェクトのベースディレクトリです。
version: '2'
services:
service1:
build:
context: .
args:
- NODE_ENV=local
ports:
- "8765:8765"
# other args skipped for clarity
service2:
build:
context: .
args:
- NODE_ENV=local
ports:
- "8766:8766"
# other args skipped for clarity
service3:
build:
context: .
dockerfile: Dockerfile-service3
args:
- NODE_ENV=local
ports:
- "8767:8767"
# other args skipped for clarity
service4:
build:
context: .
args:
- NODE_ENV=local
ports:
- "8768:8768"
# other args skipped for clarity
このように、service3
を除くすべてのサービスは、標準のDockerfile
を使用して構築され、service3
はDockerfile-service3
を使用して構築されます。