web-dev-qa-db-ja.com

docker-compose:複数のサービスに複数のDockerfileを使用する

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パッケージ...

私に何ができる? mainpostgresdbサービスを使用しようとしましたが、残念ながらpythonとそのパッケージを引き継がないため、次のような単一のDockerfileを書き込むことができませんPostgresデータベース(シェルスクリプトを使用)とそのテーブル(Pythonスクリプトを使用)を作成します。

14
aralar

Dockerがビルドコンテキストを処理する方法が原因で、これは不可能です。

thatサービスのDockerビルドコンテキストの一部になる各ディレクトリにDockerfileを使用して配置する必要があります。

参照: Dockerfile

実際にはdocker-compose.ymlは次のようになります:

service1:
    build: service1

service2:
    build: service2

参照: docker-compose

更新:

あなたの特定のユースケースに対処するため-私があなたが何をしようとしているのか、そして私が個人的にこれを自分でしない理由を理解していますが。分離は良いことであり、期待と複雑さを管理するのに役立ちます。 「データベースの作成」は、アプリのソースコードに基づく別のコンテナとして、またはアプリコンテナ自体の中で実行します。

あるいは、 shutitでの経験はありませんが、神の異議を唱えた)など、よりスクリプト化されたテンプレート駆動型のソリューションを見ることができます。

FWIW:懸念の分離ftw :)

12
James Mills

ビルドセクションに追加する必要があります。したがって、サービスごとに異なる代替dockerfileを指定できます。

services:
  service1:
    build:
        context: .
        args:
            - NODE_ENV=local
        dockerfile: Dockerfile_X
    ports:
        - "8765:8765"
8
mulg0r

ShutItの作成者はこちら。人々はそれについて良いことを聞いていると聞いて満足しました。

正直なところ、私はあなたの立場で独自のDockerfileを作成し、aptやyumなどの標準パッケージ管理を使用します。 ubuntuイメージとpython-pipおよびpython-sqlalchemyを使用した簡単なチェックは無料で利用できます。

ShutItを使用することで機能する可能性のある複雑な解決策が他にもあります。これについては少し話題から外れていると思いますので、オフラインで話し合ってください。 Shutkerはこのようなユースケース用に作成されました。これは、Dockerfileのマイクロサービススペース外のユーティリティが制限されていることを考えると、これが一般的な問題であることがわかったためです。

2
ianmiell

docker-compose.ymldockerfile引数を使用して、特定のサービスの代替の引数を指定できます。

ディスカッションが古いため、いつ追加されたかはわかりませんが、リファレンスにあることがわかります https://docs.docker.com/compose/compose-file/#dockerfile

昨日試してみましたが、問題なく動作します。 DockerfileDockerfile-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を使用して構築され、service3Dockerfile-service3を使用して構築されます。

2
mandarin