2017-07-17 10 views
2

Docker Composeでうまく動作する新しいmulti-stage build機能について認識しています。しかし、私はビルダーパターンに悩まされています(質問しないでください)... docker-compose upビルダーパターンに必要なビルドスクリプトを使用する方法はありますか?ビルダーパターンを使用する画像でDocker Composeを使用できますか?

リンク先の記事から同じビルダー・パターンファイルを考えてみましょう:

Dockerfile.build

FROM golang:1.7.3 
WORKDIR /go/src/github.com/alexellis/href-counter/ 
RUN go get -d -v golang.org/x/net/html 
COPY app.go . 
RUN go get -d -v golang.org/x/net/html \ 
    && CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . 

Dockerfile

FROM alpine:latest 
RUN apk --no-cache add ca-certificates 
WORKDIR /root/ 
COPY app . 
CMD ["./app"] 

build.sh

#!/bin/sh 
docker build -t alexellis2/href-counter:build . -f Dockerfile.build 

docker create --name extract alexellis2/href-counter:build 
docker cp extract:/go/src/github.com/alexellis/href-counter/app ./app 
docker rm -f extract 

docker build --no-cache -t alexellis2/href-counter:latest . 
rm ./app 

私ができますc Dockerを作成するこのファイルのようなファイルを作成しますが、私はどのようにしてcpの一時的なDockerコンテナからファイルを取得するのか分かりません。

ドッキングウィンドウ-compose.yml

version: '3' 
services: 
    app: 
    build: . 
    depends_on: 
    - app-build 
    app-build: 
    build: 
     context: . 
     dockerfile: Dockerfile.build 

私は一時的なドッカーイメージ/コンテナを構築し、上からbuild.shスクリプトの最初の部分を使用して、その後、剥ぎ取らコンファイルを使用してcpを実行することができますが、それでは、スクリプトに固執することもできます。

答えて

1

アプローチは、ディレクトリ・マッピングと組み合わさ2ドッカー-構成コールを、使用することができる

#This will produce local ./build/app artifact 
docker-compose build app-build 

#Having the previous artifact, will use it: 
docker-compose build app 

ちょうどDockerfileにこれを変更:

COPY build/app . 

しかし、私はあなたにマルチステージビルドアプローチをお勧めします。これよりもはるかに単純です。

+0

私は同意して努力するつもりですが、私たちの生活を簡素化し、ビルダーパターンの画像のトンを持っている必要があります:( –

+0

大丈夫、それと幸運:) – Robert

0

Docker composeにはビルド後のコンテナの起動順序を決定するためのビルドの依存関係はありません。コンテナを作成して別のビルドで使用するためにファイルをコピーすることはできません。したがって、環境が少なくとも17.05以上実行されている場合は、上記のビルドスクリプトを使用するか、新しいマルチステージビルドを使用します。

1

私が理解したように、docker cpのようなものを作成ファイル内で使用して、一時的なコンテナからアーティファクトを抽出することができるかどうかを尋ねてきます。

よく、共有のvolumeを使用するとそのためのオプションです。

version: '3' 
    services: 
     app: 
     build: . 
     depends_on: 
     - app-build 
     volumes: 
     - shared:/source   
     app-build: 
     build: 
      context: . 
      dockerfile: Dockerfile.build 
     volumes: 
     - shared:/output 
    volumes: 
     - shared: 

しかし、あなたはapp-buildがその作業を完了し、成果物の準備ができているかどうかをチェックれるappサービスでスクリプトを追加する必要があります。

共有ボリュームを使用するのは少し危険です。あなたは何をしているのか知っていなければなりません

複数のコンテナで1つ以上のデータボリュームを共有することもできます。ただし、単一の共有ボリュームに複数のコンテナを書き込むと、データが破損する可能性があります。 https://docs.docker.com/engine/tutorials/dockervolumes/#important-tips-on-using-shared-volumes

githubの上で「YAML設定にcopyを追加」というタイトルの問題があります:https://github.com/docker/compose/issues/1664

私はコンファイルでそのようなオプションを持っていると思います。あなたはこれに関する他人の意見を上記のリンクで確認することができます。その問題は今は閉鎖されていますが、再び開かれる可能性があります。そして

version: '3' 
services: 
    app: 
    build: . 

    app-build: 
    build: 
     context: . 
     dockerfile: Dockerfile.build 
    volumes: 
     - ./build/:/go/src/github.com/alexellis/href-counter/ 

関連する問題