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

时间:2017-12-04 12:38:26

标签: docker docker-compose dockerfile docker-machine

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

我试图让两个Dockerfile保持“Dockerfile实现在一个地方”,如继承:

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

首先,命名不起作用。

奖金问题:如何为生产构建图像 - 您是在一个容器(docker run)中编译,然后将二进制文件复制到新容器中吗?

2 个答案:

答案 0 :(得分:3)

不要将 dev 用作名称,而应使用标记

go:dev
go:prod

和你的compose.yml:

services:
  go:
    image: go:dev

奖励:在“编辑29/06/17”下查看this answer,并为(dev和prod)使用此构建步骤

答案 1 :(得分:0)

基本上你应该选择以下选项之一:

  1. 正如Munchkin在他的回答中所说,使用标签来区分prod和dev。如果你真的,真的,真的需要容器中的不同东西,这应该是你的选择。但通常情况并非如此。您通常总是希望以相同的方式在本地,dev和prod中运行容器 - 这是容器的好处!如果它在本地工作,它将在dev和prod中工作:)
  2. 尝试在每个阶段使用完全相同的构建。当然可能存在差异。例如,如果您有数据库,则可能不想使用生产数据库。而是使您的图像可以使用环境变量进行配置,以适应您阶段的不同配置。这是您将不同阶段构建的风险降至最低的方式!
  3. 如果您想进一步了解如何配置泊坞窗图像,可能需要阅读:https://dantehranian.wordpress.com/2015/03/25/how-should-i-get-application-configuration-into-my-docker-containers/