30

私は docker-compose を使用していますが、さまざまなサービスのビルド ステップにさまざまな Dockerfile を使用したいと考えています。ドキュメントは、異なる 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

postgresdbDockerfile は次のとおりです。

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/

postgresdbこれは今のところ機能しますが、SQL Alchemy に基づいて構築されたモデルに従ってデータベースにテーブルを作成する Python スクリプトを呼び出して、 の Dockerfileを拡張したいと思います (Python スクリプトは として呼び出されますpython manage.py create_tables)。データベースの Dockerfile に追加したかったのですが、コンテナーが分離されているため、そのイメージはpostgresPython ではなくイメージに基づいており、sqlalchemyパッケージが含まれていないため、そこで SQL Alchemy を使用できません...

私に何ができる?mainでサービスを使用しようとしましたpostgresdbが、残念ながら python とそのパッケージを引き継いでいないため、(シェル スクリプトを介して) Postgres データベースとそのテーブルを (. Python スクリプト)。

4

4 に答える 4

16

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

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

参照: Dockerfile

docker-compose.yml実際には、次のような が必要になります。

service1:
    build: service1

service2:
    build: service2

参照: docker-compose

アップデート:

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

あるいは、 shutitなどのよりスクリプト化されたテンプレート駆動型のソリューションを検討することもできます(私は経験がありませんが、神の考えを聞いています)。

FWIW: 関心の分離 ftw :)

于 2015-04-23T23:43:01.307 に答える
3

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

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

ShutIt を使用してうまくいくかもしれないもっと複雑な解決策があります。これについてはオフラインで喜んで議論します。ShutIt は、この種のユース ケース向けに作成されました。これは、マイクロサービス スペース外の Dockerfiles の限られたユーティリティを考えると、これが一般的な問題であることがわかったからです。

于 2015-05-11T10:13:29.940 に答える