Docker:プロジェクト内の複数のDockerfile


214

データベース用、アプリケーションサーバー用などの1つのDockerfileがある場合、プロジェクトに属するDockerfileをどのように編成しますか?ソースで何らかの階層を作成しますか?大規模なエンタープライズプロジェクトを1つのDockerfileだけで構成することはできませんか?


15
承認された回答を変更したい場合があります
2017年

3
「反対票を投じる」オプションがあり、廃止された「承認済み」属性をより適切な回答に自動的に移動する必要があります。そのような移動の適格基準は、1)たとえば10:1の票の大きな違い、および2)質問の作成者がたとえば1年以上ログインしていない(@LuckyLukeがSO 4年から退職したようです)以前...)
mirekphd

回答:


6

著者ノート

この回答は古くなっています。図はもう存在せず、Docker composeに置き換えられました。承認された回答は削除できません....

Docker Composeは、プロジェクト階層の構築をサポートしています。そのため、各サブディレクトリでDockerfileをサポートするのが簡単になりました。

├── docker-compose.yml
├── project1
│   └── Dockerfile
└── project2
    └── Dockerfile

元の答え

各コンポーネントのDockerfileを含むディレクトリを作成するだけです。例:

コンテナを構築するときは、ディレクトリ名を指定するだけで、Dockerは正しいDockerfileを選択します。


3
@DuncanJones受け入れられた回答は削除できないので...試してみました:-)
Mark O'Connor

285

ドッキングウィンドウの新しいバージョン(> = 1.8.0) 、あなたはこれを行うことができます

docker build -f Dockerfile.db .
docker build -f Dockerfile.web .

大きな節約。

編集:raksjaのコメントごとにバージョンを更新する

編集:@vsevolodからのコメント:ファイルに.Dockerfile拡張子(名前ではなく)を与えることで、VSコードで構文の強調表示を取得できます(例:Prod.Dockerfile、Test.Dockerfileなど)。


2
どの新しいバージョンですか?
raksja

4
チェックしたところ、github.com/docker/docker/wikiなので、> Docker 1.8.0
raksja

3
これは機能しますが、私のIDEはファイル名を認識しないため、構文の強調表示は行いません:(
Alexander Mills '27

3
@AlexanderMills私のIDE WebStormはDockerfile.web実行構成としても許可していません。だから私は問題を作成しました: youtrack.jetbrains.com/issue/WEB-28185
Steampowered

5
docker-compose.ymlたとえば、ファイル内で定義された各「サービス」に使用するDockerfileをどのように指定しますか?
JoeTidee 2017

127

別々のディレクトリでdocker-compose複数使用するDockerfile

あなたの名前は変更しないでくださいDockerfileにしDockerfile.dbたりDockerfile.webにください。IDEでサポートされていない可能性があり、構文の強調表示が失われます。

以下のようキングスレーUchnorが言った、あなたは複数を持つことができますDockerfileますが、ビルドに必要なものを表し、ディレクトリごとに1つずつ、。

docker各アプリケーションとその構成を保持するフォルダーが欲しい。これは、データベースを持つWebアプリケーションのプロジェクトフォルダー階層の例です。

docker-compose.yml
docker
├── web
│   └── Dockerfile
└── db
    └── Dockerfile

docker-compose.yml 例:

version: '3'
services:
  web:
    # will build ./docker/web/Dockerfile
    build: ./docker/web
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  db:
    # will build ./docker/db/Dockerfile
    build: ./docker/db
    ports:
      - "3306:3306"
  redis:
    # will use docker hub's redis prebuilt image from here:
    # https://hub.docker.com/_/redis/
    image: "redis:alpine"

docker-compose コマンドラインの使用例:

# The following command will create and start all containers in the background
# using docker-compose.yml from current directory
docker-compose up -d

# get help
docker-compose --help

Dockerfileをビルドするときに以前のフォルダーのファイルが必要な場合

上記のソリューションを引き続き使用して、Dockerfileなどのディレクトリにを配置docker/web/Dockerfileできます。必要なのはcontext、次のdocker-compose.ymlようにビルドを設定することだけです。

version: '3'
services:
  web:
    build:
      context: .
      dockerfile: ./docker/web/Dockerfile
    ports:
     - "5000:5000"
    volumes:
     - .:/code

このようにすると、次のようなことが可能になります。

config-on-root.ini
docker-compose.yml
docker
└── web
    ├── Dockerfile
    └── some-other-config.ini

そして./docker/web/Dockerfileこのような:

FROM alpine:latest

COPY config-on-root.ini /
COPY docker/web/some-other-config.ini /

tldr docker-composeのいくつかのクイックコマンドを次に示します。詳細については、公式ドキュメントを参照してください。


1
ビルド時にdepをインストールするためにパッケージマネージャーファイルをコピーする必要がある場合(fi COPY ../package.json /app/package.json)そのファイルは通常ルートレベルにあり、Dockerは親へのアクセスを禁止しています。どのようなアプローチをとりますか?
nass600 2018

1
私もその制限をヒットしてきたし、この例外のために、私は構築webからプロジェクト. (中にdocker-compose.ymlbuild: .)。この方法でwebは、ビルド時にルートファイルにアクセスできます。私はこの関連する質問を見てきました:stackoverflow.com/questions/24537340/…dockerコマンドラインを使用するときに代わりに親ディレクトリからビルドできます。この回答はdocker-composeでそれを行う方法を示しています:stackoverflow.com/a/45353241/ 1092815
GabLeRoux

1
これは、dockerではなくIDEの問題です。@Shuoが正解です。
BentOnCoding 2018年

1
2番目の回答は1年前のものですが、Dockerのドキュメントから直接取得したものではありません。-fオプションで結構ですがdocker-compose、サブフォルダで使用することを好みます。どちらの答えも有効だと思います。ほとんどの人は、デフォルトのDockerfile名前をそのまま使用してほとんどのIDEをそのままサポートすることを好むでしょう。私は最初の回答を無効にするのではなく、代わりを提供するだけです。IDEでphpを使用するときにDockerfileがファイルであると思われたくないのですDockerfile.phpが、はい、動作します。dockerドキュメンテーションでいくつかの例を見てきました。Dockerfile.buildDockerfile.debugなど
GabLeRoux 2018年

3
名前をexample.Dockerfile付けると、VSCodeで構文の強調表示とアイコンが保持されます。
vmasschetto 2018年

8

Intellijでは、単純にdockerファイルの名前を* .Dockerfileに変更し、ファイルタイプ* .Dockerfileをdocker構文に関連付けました。


1
これを試してみると、素晴らしいDockerアイコンが表示されます。
Drumbeg 2018年

3

例えば、抽象化レイヤを追加し、このプロジェクトのようなYAMLファイルhttps://github.com/larytet/dockerfile-generatorのように見えます

centos7:
    base: centos:centos7
    packager: rpm
    install:
      - $build_essential_centos 
      - rpm-build
    run:
      - $get_release
    env:
      - $environment_vars

短いPythonスクリプト/ makeは、構成ファイルからすべてのDockerfileを生成できます。


1

複数のdockerfileを使用する必要があるプロジェクトで作業する場合は、各dockerfileを別のディレクトリに作成するだけです。例えば、

app / db /

上記の各ディレクトリにはdockerfileが含まれます。アプリケーションがビルドされると、dockerはすべてのディレクトリを検索してすべてのdockerfilesをビルドします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.