Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 为开发人员和生产环境构建容器_Docker_Docker Compose_Dockerfile_Docker Machine - Fatal编程技术网

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

Docker 为开发人员和生产环境构建容器,docker,docker-compose,dockerfile,docker-machine,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

您如何为开发和生产建立形象(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)中编译,然后将二进制文件复制到新容器中?

不要将dev用作名称,而是作为标记:

还有你的compose.yml:

services:
  go:
    image: go:dev
额外好处:查看“编辑29/06/17”下的内容,并将此构建步骤同时用于(开发人员和产品)

不要将开发人员用作名称,而是用作标记:

还有你的compose.yml:

services:
  go:
    image: go:dev

奖励:查看“编辑29/06/17”下的内容,并将此构建步骤同时用于(开发和生产)

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

  • 正如芒奇金在他的回答中所说,使用标签来区分产品和开发。如果你真的,真的,真的需要容器中的不同东西,这应该是你的选择。但通常情况并非如此。您通常希望以相同的方式在本地、在dev和prod中运行容器——这是容器的优点!如果它在本地工作,它将在dev和prod中工作:)
  • 尝试在每个阶段使用完全相同的构建。当然可能会有不同。例如,如果您有一个数据库,您可能不想使用生产数据库。相反,使用环境变量对图像进行配置,以适应不同阶段的配置。这是将不同阶段构建的风险降至最低的方法
    如果您想进一步了解如何配置docker映像,您可能需要阅读以下内容:

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

  • 正如芒奇金在他的回答中所说,使用标签来区分产品和开发。如果你真的,真的,真的需要容器中的不同东西,这应该是你的选择。但通常情况并非如此。您通常希望以相同的方式在本地、在dev和prod中运行容器——这是容器的优点!如果它在本地工作,它将在dev和prod中工作:)
  • 尝试在每个阶段使用完全相同的构建。当然可能会有不同。例如,如果您有一个数据库,您可能不想使用生产数据库。相反,使用环境变量对图像进行配置,以适应不同阶段的配置。这是将不同阶段构建的风险降至最低的方法
    如果您想进一步了解如何配置docker映像,您可能需要阅读以下内容:

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