当前位置: 首页 > 面试题库 >

如何为开发和生产使用相同的dockerfile

许寒
2023-03-14
问题内容

我有2个Dockerfile,1个用于dev,1个用于prod:

产品:

FROM golang AS builder
WORKDIR /go/src/gitlab.com/company/project
COPY . .
RUN go build -o ./release/api .

FROM scratch
EXPOSE 9999
COPY --from=builder /go/src/gitlab.com/company/project/release/api .
CMD ["./api"]

和DEV:

FROM golang
WORKDIR /go/src/gitlab.com/company/PROJECT
COPY . .
RUN go build -o ./release/api .
CMD ["./release/api"]

我想将这两个合并为一个,因为维护2个Dockerfile是一个坏习惯

主要区别在于,在开发人员中,我从事golang实用的图像工作,而在产品中,我从事scratch图像工作,这大大减少了二进制文件的大小。

看来我可以在Dockerfile中使用多个阶段,并在构建时指定阶段名称:

docker build . --target=builder

但是,如果这样做,我不知道如何在第一阶段有条件地运行我的应用程序= [如果我在开发人员中,请在第一阶段运行该应用程序,否则,请在第二阶段运行该应用程序]

我该怎么办?


问题答案:

那这样的东西呢?我没有对其进行测试,也没有对您的示例进行深入的思考,但是也许与您需要的东西很接近/可以帮助您找到最终的解决方案?

FROM golang:alpine AS base
WORKDIR /go/src/gitlab.com/company/project
COPY . .
RUN go build -o ./release/api .

FROM base AS dev
CMD ["./release/api"]

FROM scratch AS prod
EXPOSE 9999
COPY --from=base /go/src/gitlab.com/company/project/release/api .
CMD ["./api"]

根据target docker build --target=prod或中指定的值docker build --target=dev,将生成其他图像。



 类似资料:
  • 问题内容: 我将docker用于laravel项目的开发和生产。我用于开发和生产的dockerfile略有不同。例如,我在开发环境中将本地目录安装到docker容器中,因此我不需要为代码中的每个更改进行docker构建。 由于挂载目录仅在运行docker容器时可用,因此无法在开发文件中将诸如“ composer install”或“ npm install”之类的命令放入dockerfile中。

  • 我使用docker为laravel项目开发和生产。我有一个稍微不同的dockerfile用于开发和生产。例如,我在开发环境中将本地目录装载到docker容器中,这样我就不需要为代码中的每个更改进行docker构建。 由于挂载目录只有在运行docker容器时才可用,因此我无法将“composer install”或“npm install”之类的命令放入dockerfile中进行开发。 目前,我正在

  • 我们有一个包含对象集合的开发服务器。这些对象的实际积累是一个持续的过程,在这个本地开发服务器上运行标签、验证等的整个过程。一旦这些对象准备好生产,它们就会被添加到生产数据库中,从那时起,生产数据库将在其计算中使用它们。 我正在寻找一种简单地将增量(新对象)添加到生产数据库中的方法,同时将所有其他集合和旧对象保留在同一个集合中。到目前为止,我们一直使用MySql,所以这个过程只涉及运行数据库结构和数

  • 问题内容: 我一直在开发一个基本的应用程序。现在在部署阶段,很明显,我需要本地设置和生产设置。 很高兴知道以下内容: 如何最好地应对开发和生产设置。 如何仅在开发环境中保留django-debug-toolbar之类的应用程序。 开发和部署设置的其他任何技巧和最佳做法。 问题答案: 该DJANGO_SETTINGS_MODULE环境变量,其设置文件Django的控件将加载。 因此,你将为各自的环境

  • 问题内容: 我有一个GlassFish / j2ee应用程序,我在一个盒子上进行开发,而生产是一个远程盒子。我有一个制作文件的功能,根据我的开发箱或生产环境,我需要文件的位置不同。什么是自动切换方式,所以我不必根据部署源文件来编辑源文件? 问题答案: 最简单的方法是定义一个系统属性,该属性指定数据的文件系统位置。生产应用服务器将定义一个值(在启动脚本中使用),而开发应用服务器将定义另一个值。您的应

  • 您如何为开发和生产(集群)构建图像: 我正试图为两者都提供一个Dockerfile,以保持“Dockerfile实现在一个地方”,如继承: 然后使用docker compose。开发yml 就像docker compose一样。开发yml: 所以首先,命名不起作用。 额外的问题:如何为生产构建一个映像-您是否只需在一个容器中编译(docker运行),然后将二进制文件复制到一个新容器中?