2017-06-11 57 views
3

這可能是一個愚蠢的問題,但我是使用Docker-compose的新手。到目前爲止,我喜歡它......但是我的構建時間很長。我有一個有幾個依賴項目的項目,每次進行更改時都需要明顯重建源代碼。現在,我打電話docker-compose build來重建容器,然後是docker-compose up。問題是:如何在使用Docker Compose時有效地重建項目?

  1. 它重建整個容器的每一個改變我對源代碼(這需要很長的時間 - 獲取依賴/等)。這大大減緩了我的速度。

  2. 我真的覺得我應該只能夠在容器上運行一個命令重建,然後重新運行可執行文件,像那麼:

     
    docker-compose run web go build . 
    docker-compose run web ./app
     
    docker-compose run web go build . 
    docker-compose restart 
    
    這應該工作,因爲我使用的卷共享代碼在主機和容器之間。不應該有需要重新獲取所有的依賴關係。它不應該使用新建的可執行文件嗎?但是,這並不能反映內置的更改和端口轉發似乎中斷。

供參考,這是我的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 

當對於以前的版本一換層,搬運工會丟棄以下緩存層的再次運行它們,有時候會浪費你的時間。

請注意Docker在每個圖層中輸出的「使用緩存」句子,該句子在以前的構建中重用。

對於您的開發工作,另一個建議是使用fresh在您每次更改代碼時自動重新構建您的應用程序。只需將它安裝在容器中,並在您的docker-compose.yml中簡單使用command: fresh

0

如果您想改進Docker impl,則可以製作較小的圖像。我建議「多級構建」做

對於此版本的圖像尺寸是像600MB

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 

採用多級構建您使用一個用於構建應用程序的沉重圖像,另一個用於運行應用程序的小圖像。

相關問題