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

Dev*_*dka 20 docker dockerfile

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

由于挂载的目录仅在运行docker容器时可用,所以我无法在dockerfile中输入"composer install"或"npm install"等命令进行开发.

目前我正在管理两个docker文件,有什么办法可以用单个docker文件做这个,并决定在通过发送参数进行docker build时运行哪些命令.

我想要实现的是

在docker文件中

...
IF PROD THEN RUN composer install
...
Run Code Online (Sandbox Code Playgroud)

在docker build期间

docker build [PROD] -t mytag .
Run Code Online (Sandbox Code Playgroud)

Mic*_*ler 18

您可以使用两个不同的Dockerfiles.

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

# ....
Run Code Online (Sandbox Code Playgroud)

第二个:

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

RUN composer install
Run Code Online (Sandbox Code Playgroud)

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

$> docker build -t mytag .
$> docker build -t mytag-production -f Dockerfile.production .
Run Code Online (Sandbox Code Playgroud)


yam*_*enk 17

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

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

创建一个shell脚本,调用install.sh类似于:

if [ ${ENV} = "DEV" ]; then 
    composer install
else
    npm install
fi
Run Code Online (Sandbox Code Playgroud)

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

...
COPY install.sh install.sh
RUN chmod u+x install.sh && ./install.sh
...
Run Code Online (Sandbox Code Playgroud)

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

docker build --build-arg "ENV=PROD" ...
Run Code Online (Sandbox Code Playgroud)


Nic*_*Roz 7

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

Dockerfile 必须是这样的:

FROM alpine
ARG mode
RUN if [ "x$mode" = "xdev" ] ; then echo "Development" ; else echo "Production" ; fi
Run Code Online (Sandbox Code Playgroud)

要检查的命令是:

docker build -t app --build-arg mode=dev .
docker build -t app --build-arg mode=prod .
Run Code Online (Sandbox Code Playgroud)

  • 很好,但是为什么 $mode 前面有“x”?一定是有原因的。 (4认同)
  • 只是插值的一个例子 (2认同)

jor*_*vin 5

我已经尝试了几种方法,包括使用 docker-compose、多阶段构建、通过文件传递参数以及其他答案中使用的方法。我的公司需要一个很好的方法来做到这一点,在尝试了这些之后,这是我的意见。

最好的方法是通过 cmd 传递 arg。您可以在右键单击并选择构建图像的同时通过 vscode 传递它,同时 使用以下代码单击图像构建的visual studio代码图像

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
Run Code Online (Sandbox Code Playgroud)

并在 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
Run Code Online (Sandbox Code Playgroud)