为开发和生产环境构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.yml
和docker-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)
基本上你应该采取以下其中一个选项:
- 正如芒奇金在他的回答中所说,使用标签来区分产品和开发。 这应该是你的select,如果你真的,真的需要在容器中的不同的东西。 但通常情况不是这样的。 您通常总是希望在本地运行容器,并以同样的方式运行 – 这是关于容器的好处! 如果它在本地工作,它将工作在开发和prod 🙂
- 尝试在每个阶段使用完全相同的构build。 当然可能有区别。 例如,如果你有一个数据库,你可能不想采取生产数据库。 而是使用环境variables对图像进行configuration,以适应舞台的不同configuration。 这是你最大限度地减less不同阶段build设的风险!
如果您想进一步阅读如何configuration泊坞窗镜像,您可能需要阅读: https : //dantehranian.wordpress.com/2015/03/25/how-should-i-get-application-configuration-into -My-搬运工的容器/