当前位置: 首页 > 知识库问答 >
问题:

如何为开发和生产配置不同的dockerfile

裴俊能
2023-03-14

我使用docker为laravel项目开发和生产。我有一个稍微不同的dockerfile用于开发和生产。例如,我在开发环境中将本地目录装载到docker容器中,这样我就不需要为代码中的每个更改进行docker构建。

由于挂载目录只有在运行docker容器时才可用,因此我无法将“composer install”或“npm install”之类的命令放入dockerfile中进行开发。

目前,我正在管理两个docker文件,是否有任何方法可以使用单个docker文件来实现这一点,并通过发送参数来决定在进行docker构建时要运行哪些命令。

我想要实现的是

在docker文件

...
IF PROD THEN RUN composer install
...

在docker构建期间

docker build [PROD] -t mytag .

共有3个答案

云季同
2023-03-14

您可以直接使用build args,而不提供额外的sh脚本。不过可能看起来有点凌乱。但它是有效的。

Dockerfile必须是这样的:

FROM alpine
ARG mode
RUN if [ "x$mode" = "xdev" ] ; then echo "Development" ; else echo "Production" ; fi

要检查的命令有:

docker build -t app --build-arg mode=dev .
docker build -t app --build-arg mode=prod .
张溪叠
2023-03-14

更新(2020):自从3年前写这篇文章以来,很多事情都发生了变化(包括我对这个话题的看法)。我建议的方法是使用一个dockerfile和脚本。请看@yamenk的答案。

原创:

您可以使用两个不同的DockerFile。

# ./Dockerfile (non production)
FROM foo/bar
MAINTAINER ...

# ....

第二个:

# ./Dockerfile.production
FROM foo/bar
MAINTAINER ...

RUN composer install

调用build命令时,您可以告诉它应该使用哪个文件:

$> docker build -t mytag .
$> docker build -t mytag-production -f Dockerfile.production .
浦琪
2023-03-14

作为最佳实践,您应该尝试使用一个Dockerfile以避免不同环境之间的意外错误。但是,您可能有一个无法做到这一点的用例。

Dockerfile语法不够丰富,无法支持这种场景,但是您可以使用shell脚本来实现这一点。

创建一个shell脚本,称为安装。sh的作用类似于:

if [ ${ENV} = "DEV" ]; then 
    composer install
else
    npm install
fi

在Dockerfile中添加此脚本,然后在构建时执行它

...
COPY install.sh install.sh
RUN chmod u+x install.sh && ./install.sh
...

构建时,传递构建参数以指定环境,例如:

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

  • 问题内容: 我有2个Dockerfile,1个用于dev,1个用于prod: 产品: 和DEV: 我想将这两个合并为一个,因为维护2个Dockerfile是一个坏习惯 主要区别在于,在开发人员中,我从事实用的图像工作,而在产品中,我从事图像工作,这大大减少了二进制文件的大小。 看来我可以在Dockerfile中使用多个阶段,并在构建时指定阶段名称: 但是,如果这样做,我不知道如何在第一阶段有条件地

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

  • 目标 建立一个lesson3项目,解决上一节lesson2遗留下来的—即开发环境打包到生产环境的问题。 知识点 1、process.env.NODE_ENV:node运行环境变量。 课程内容 process.env.NODE_ENV是node运行时的全局变量,node服务端中的任一js文件中都可以拿到它的值,先来试试是否真的能获取到值 先新建一个lesson3的项目,再创建一个test.js文件

  • 我试图在Grails 2.2.4中采用Quartz插件(:Quartz:1.0.1),并试图弄清楚如何允许开发和测试使用不同于生产所需的进度表,而不必更改部署到每个进度表的代码。 以下是我的经验。 我正在使用一个JDBC JobStore和Quartz Monitor插件(:Quartz-Monitor:1.0)。所以我的工作是这样定义的: 当我运行Grails应用程序时,将为作业设置触发器,并将

  • 问题内容: 用于express.js环境。有什么建议? 问题答案: 在运行您的应用之前,您可以在控制台中执行此操作, 或者,如果您在Windows中,则可以尝试以下操作: 或者您可以这样运行您的应用程序: 您也可以在js文件中进行设置: 但是我不建议在运行时文件中执行此操作,因为在服务器中打开VIM并将其更改为生产环境并不容易。您可以在目录中创建config.json文件,并且每次您的应用运行时,