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

时间:2017-09-27 06:30:07

标签: docker dockerfile

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

由于安装目录只有在运行docker容器时才可用,我无法输入像#34; composer install"这样的命令。或者" npm install"在dockerfile中进行开发。

目前我正在管理两个docker文件,有没有办法可以用单个docker文件执行此操作,并决定在通过发送参数进行docker build时运行哪些命令。

我想要实现的是

在泊坞窗文件中

maxWidth

在泊坞窗构建期间

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

4 个答案:

答案 0 :(得分:13)

作为最佳实践,您应该尝试使用一个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
...

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

docker build --build-arg "ENV=PROD" ...

答案 1 :(得分:8)

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

# ./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 .

答案 2 :(得分:0)

您可以直接使用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 .

答案 3 :(得分:0)

我有几种方法,例如通过docker-compose,multistage,通过文件传递arg以及像上面指定的那样 我的公司需要采取一种好的方法来做到这一点,而我正在尝试一些方法,这是我的看法

最好的方法是将arg传递给cmd,也可以通过vscode传递给arg,同时右击并单击生成映像 Image of visual studio code while clikcing image build 并在代码中为

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