如何在使用Docker Compose时有效地重build项目?

这可能是一个愚蠢的问题,但我是使用Docker-compose的新手。 到目前为止,我喜欢它,但是我的构build时间很长。 我有一个项目有几个依赖关系,每当我做出改变时,我都需要显然重build源代码。 现在,我打电话给docker-compose build重build容器,接着是docker-compose up 。 问题是:

  1. 它会重build整个容器,以便对源代码进行每次更改(这需要很长时间 – 获取依赖关系/ etc)。 这显着减慢了我的速度。

  2. 我真的觉得我应该能够在容器上运行一个命令来重build,然后重新运行可执行文件,就像这样:

     docker-compose运行web go build。
     docker-compose运行web ./app 

    要么

     docker-compose运行web go build。
     docker-compose重启
    

    这应该工作,因为我正在使用一个卷在主机和容器之间共享代码。 不应该有需要重新获取所有的依赖关系。 不应该使用新build的可执行文件吗? 但是,这并不能反映内置的变化和端口转发似乎中断。

作为参考,这里是我的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 

和我的docker-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 

有什么我失踪?

你问了一个很好的问题。

Dockerfile中的命令的顺序真的很重要。 先把那些不会变化的东西,以及那些最有可能在每一个版本中都改变的东西,

 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丢弃下面的caching图层,再次运行它们,有时候会浪费你的时间。

注意Docker输出的“使用caching”句子,每一层在前一次构build中重用。

另一个build议,对于您的开发工作,每次更改代码时都会自动重新构build您的应用程序。 只需将其安装在容器中,只需使用command: fresh docker-compose.yml中的command: fresh即可

如果你想改善你的Docker impl,你可以制作一个更小的图像。 我build议“多阶段build设”来做到这一点

这个版本的图像大小是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 

使用多阶段构build,图像权重是二进制和划痕的大小

 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 

使用多阶段构build,您正在使用沉重的图像来构build应用程序,而另一个则使用更小的程序来运行您的应用程序。