2017-06-11 12 views
3

これは愚かな質問かもしれませんが、私はDocker-composeを使うのが初めてです。これまでのところ、私はそれが大好きです...しかし、私はいくつかの長いビルド時間を持っています。私はいくつかの依存関係を持つプロジェクトを持っており、変更を加えるたびにソースを明らかに再構築する必要があります。今、私はdocker-compose buildにコンテナを再構築し、その後にdocker-compose upと呼んでいます。問題は次のとおりです。Docker Composeの使用中にプロジェクトを効率的に再構築する方法?

  1. それは私が( - 依存関係の/ etcをフェッチ時間がかかります)ソースコードに対して行ったすべての変更のため、容器全体を再構築です。これは私をかなり遅くしています。私は共有するボリュームを使用していますので、これは動作するはず

     
    docker-compose run web go build . 
    docker-compose run web ./app
    または
     
    docker-compose run web go build . 
    docker-compose restart 
    

  2. 私は本当に私はちょうど同じよう-ので、実行可能ファイルを再構築してから再実行するコンテナ上でコマンドを実行することができますように感じますホストとコンテナの間のコード。すべての依存関係を再フェッチする必要はありません。新しくビルドされた実行可能ファイルを使用するべきではありませんか?ただし、これには変更が反映されておらず、ポート転送が中断しているようです。参考のため

、ここで私のDockerfileです:

FROM golang:1.8 

COPY . /go/src/github.com/codeblooded/test1 
WORKDIR /go/src/github.com/codeblooded/test1 

RUN echo $PATH 
RUN go get -d -v ./... 
RUN go install -v ./... 

RUN go build -o test1 . 
CMD ["test1"] 
EXPOSE 3470 

そして、私のドッキングウィンドウ-compose.ymlファイル:

version: '3' 
services: 
    postgres: 
    image: postgres 
    volumes: 
     - ./db/data/psql:/var/lib/postgresql/data 
     - ./db/schema:/db/schema 
    redis: 
    image: redis 
    volumes: 
     - ./db/data/redis:/data 
    server: 
    build: . 
    command: test1 
    volumes: 
     - .:/go/src/github.com/codeblooded/test1 
    ports: 
     - "3470:3470" 
    depends_on: 
     - postgres 
     - redis 

は、私が欠けている何かがありますか?

答えて

4

あなたは良い質問をしました。

Dockerfileでのコマンドの順序が重要です。最初後でfrecuently変わらないもの、およびすべてのビルドに変更する可能性が最も高いもの入れ:以前のビルドについての層の変化は、ドッキングウィンドウはそれらを再度実行し、次のキャッシュされた層を破棄した場合

FROM golang:1.8 

RUN go get -d -v ./... 
RUN go install -v ./... 

COPY . /go/src/github.com/codeblooded/test1 
WORKDIR /go/src/github.com/codeblooded/test1 

RUN echo $PATH 

RUN go build -o test1 . 
CMD ["test1"] 
EXPOSE 3470 

を、あなたの時間を浪費することもあります。

以前のビルドから再利用された各レイヤーでドッカーが出力する「キャッシュの使用」文に注意してください。

あなたの開発作業のもう1つの推奨事項は、freshを使用して、コードを変更するたびに自動的にgoアプリケーションを再構築することです。単にコンテナにインストールして、単にdocker-compose.ymlにcommand: freshを使用するだけです。

0

そして、Docker implを改善したい場合は、より小さな画像を作成できます。私は、このビルドの

画像サイズが構築し、多段階を使用して600メガバイト

FROM golang:1.8 

RUN go get -d -v ./... 
RUN go install -v ./... 

COPY . /go/src/github.com/codeblooded/test1 
WORKDIR /go/src/github.com/codeblooded/test1 

RUN echo $PATH 

RUN go build -o test1 . 
CMD ["test1"] 
EXPOSE 3470 

のようなものであることを行うには、「多段階のビルド」を提案、映像重量はの大きさでありますバイナリとスクラッチ多段階は、使用しているビルドを使用して

FROM golang:1.8 as builder 

RUN go get -d -v ./... 
RUN go install -v ./... 

COPY . /go/src/github.com/codeblooded/test1 

WORKDIR /go/src/github.com/codeblooded/test1 

RUN echo $PATH 
RUN CGO_ENABLED=0 GOOS=linux go build -o test1 . 


FROM alpine:latest 

RUN apk --no-cache add ca-certificates 

WORKDIR /go/src/github.com/codeblooded/ 

COPY --from=builder /go/src/github.com/codeblooded/test1 . 

CMD ["test1"] 

EXPOSE 3470 

アプリをビルドするための重いイメージと、あなたのアプリを実行するためのもう少し小さなものです。

関連する問題