我使用docker进行开发和laravel项目的制作。我有一些稍微不同的dockerfile用于开发和生产。例如,我将本地目录挂载到开发环境中的docker容器,这样我就不需要为代码中的每个更改进行docker构建。
由于安装目录只有在运行docker容器时才可用,我无法输入像#34; composer install"这样的命令。或者" npm install"在dockerfile中进行开发。
目前我正在管理两个docker文件,有没有办法可以用单个docker文件执行此操作,并决定在通过发送参数进行docker build时运行哪些命令。
我想要实现的是
在泊坞窗文件中
maxWidth
在泊坞窗构建期间
...
IF PROD THEN RUN composer install
...
答案 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