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

pxq42qpu  于 2023-01-25  发布在  Docker
关注(0)|答案(5)|浏览(137)

我在laravel项目的开发和生产中使用docker。我在开发和生产中使用的docker文件略有不同。例如,我在开发环境中将本地目录安装到docker容器中,这样我就不需要为代码的每次更改都进行docker构建。
由于挂载目录只有在运行docker容器时才可用,因此我无法将“composer install”或“npm install”等命令放在dockerfile中进行开发。
目前我正在管理两个docker文件,是否有任何方法,我可以做到这一点与单一的docker文件,并决定哪些命令运行时,做docker建设发送参数。

我想要实现的是
在Docker文件中

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

Docker构建期间

docker build [PROD] -t mytag .
yqyhoc1h

yqyhoc1h1#

作为一个最佳实践,你应该尝试使用一个Dockerfile来避免不同环境之间的意外错误。然而,你可能有一个用例,你不能这样做。
Dockerfile语法不够丰富,不足以支持这样的场景,但是您可以使用shell脚本来实现。
创建一个名为install.sh的shell脚本,执行如下操作:

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" ...
xnifntxz

xnifntxz2#

**更新(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 .
w8biq8rn

w8biq8rn3#

您可以直接使用构建参数,而无需提供额外的sh脚本。尽管看起来可能有点混乱,但它确实有效。
停靠文件必须是这样的:

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 .
jhdbpxl9

jhdbpxl94#

我已经尝试了几种方法,包括使用docker-compose、多阶段构建、通过文件传递参数以及其他答案中使用的方法。我的公司需要一种好的方法来做到这一点,在尝试了这些方法后,我的观点如下。
最好的方法是通过cmd传递arg。您可以在右击并选择构建映像Image of visual studio code while clicking image build时通过vscode传递arg,使用以下代码:

ARG BuildMode
RUN echo $BuildMode
RUN if [ "$BuildMode" = "debug" ] ; then apt-get update \
    && apt-get install -y --no-install-recommends \
       unzip \
    && rm -rf /var/lib/apt/lists/* \
    && curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l /vsdbg ; fi

在dockerfile的构建部分中:

ARG BuildMode
ENV Environment=${BuildMode:-debug}
RUN dotnet build "debugging.csproj" -c $Environment -o /app

FROM build AS publish
RUN dotnet publish "debugging.csproj" -c $Environment -o /app
n1bvdmb6

n1bvdmb65#

最好的方法是在项目中使用. env文件。您可以定义两个变量CONTEXTDIRECTORY和DOCKERFILENAME,然后创建Dockerfile-dev和Dockerfile-prod
这是使用它的示例:
Docker合成文件:

services:
  serviceA:
    build: 
      context: ${CONTEXTDIRECTORY:-./prod_context}
      dockerfile: ${DOCKERFILENAME:-./nginx/Dockerfile-prod}

项目根目录中的. env文件:

CONTEXTDIRECTORY=./
DOCKERFILENAME=Dockerfile-dev

注意上下文,它的路径从你指定的dockerfile目录开始,而不是从docker-compose目录开始。
在默认值i中使用prod,因为如果您忘记指定env变量,您将无法意外地在生产中构建dev版本
使用不同文档的解决方案比使用脚本更方便,更容易修改和维护

相关问题