为开发和生产环境构build容器

如何为开发和生产(swarm)构build图像:

我正在尝试有一个Dockerfile来保持“Dockerfile实现在一个地方”像inheritance:

 FROM golang AS gobase ENV APP_ENV "pro" COPY ./app /go/src/github.com/user/myProject/app WORKDIR /go/src/github.com/user/myProject/app RUN go get ./ RUN go build EXPOSE 8080 FROM gobase AS godev ENV APP_ENV "dev" RUN go get github.com/pilu/fresh RUN go-wrapper download RUN go-wrapper install CMD [ "fresh" ] 

然后使用docker-compose.dev.ymldocker-compose.pro.yml

像docker-compose.dev.yml一样:

 version: '2' services: godev: environment: - APP_ENV="dev" image: godev 

所以首先,命名不起作用。

奖金的问题:如何build立一个生产的图像 – 你只是在一个容器(docker运行)编译,然后将二进制文件复制到一个新的容器?

不要使用dev作为名称,而是使用标签

 go:dev go:prod 

和你的compose.yml:

 services: go: image: go:dev 

奖励:在“编辑29/06/17”下查看这个答案 ,并使用这个构build步骤(dev和prod)

基本上你应该采取以下其中一个选项:

  1. 正如芒奇金在他的回答中所说,使用标签来区分产品和开发。 这应该是你的select,如果你真的,真的需要在容器中的不同的东西。 但通常情况不是这样的。 您通常总是希望在本地运行容器,并以同样的方式运行 – 这是关于容器的好处! 如果它在本地工作,它将工作在开发和prod 🙂
  2. 尝试在每个阶段使用完全相同的构build。 当然可能有区别。 例如,如果你有一个数据库,你可能不想采取生产数据库。 而是使用环境variables对图像进行configuration,以适应舞台的不同configuration。 这是你最大限度地减less不同阶段build设的风险!

如果您想进一步阅读如何configuration泊坞窗镜像,您可能需要阅读: https : //dantehranian.wordpress.com/2015/03/25/how-should-i-get-application-configuration-into -My-搬运工的容器/