【问题标题】:Build containers for dev and production environment为开发和生产环境构建容器
【发布时间】:2017-12-04 12:38:26
【问题描述】:

你如何为开发和生产构建镜像(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),然后将二进制文件复制到一个新容器中?

【问题讨论】:

  • 我不清楚你的问题是什么。 “命名不起作用”是什么意思?
  • 在撰写文件中传递环境变量的方式只会在运行时赋予它该值。如果要在构建过程中更新ENV,则需要使用ARG--build-arg

标签: docker docker-compose dockerfile docker-machine


【解决方案1】:

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

go:dev
go:prod

还有你的 compose.yml:

services:
  go:
    image: go:dev

奖励:查看“29/06/17 编辑”下的 this answer,并将此构建步骤用于(开发和产品)

【讨论】:

    【解决方案2】:

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

    1. 正如 Munchkin 在他的回答中所说,使用标签来区分 prod und dev。如果您真的,真的,真的需要容器中的不同东西,这应该是您的选择。但通常情况并非如此。您通常总是希望以相同的方式在本地、dev 和 prod 中运行容器 - 这是容器的好处!如果它在本地工作,它将在 dev 和 prod 中工作:)
    2. 尝试在每个阶段使用完全相同的构建。当然可能会有差异。例如,如果您有一个数据库,您可能不想使用生产数据库。而是使用环境变量使您的图像可配置,以适应您的阶段的不同配置。这是您将不同阶段构建的风险降至最低的方法!

    如果您想进一步了解如何配置 docker 映像,您可能需要阅读以下内容:https://dantehranian.wordpress.com/2015/03/25/how-should-i-get-application-configuration-into-my-docker-containers/

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 2018-06-04
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      相关资源
      最近更新 更多