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

问题描述:

我使用docker进行开发和生产laravel项目。我有一些不同的dockerfile用于开发和生产。例如,我在开发环境中将本地目录挂载到docker容器,以便我不需要为代码中的每个更改都执行docker build。如何为开发和生产配置不同的dockerfile

由于挂载的目录将只在运行docker容器时可用我不能在dockerfile中为“开发”放置“composer install”或“npm install”等命令。

目前我正在管理两个docker文件,有没有什么办法可以通过单个docker文件来做到这一点,并决定在通过发送参数进行docker构建时运行哪些命令。

我所试图实现的是

在泊坞窗文件

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

在码头工人建立

docker build [PROD] -t mytag . 
+0

最好是使用相同的,并overl您的设备对生产图像的要求。 – Matt

+0

[当我的开发环境将我的代码库装入容器时,如何构建docker映像?](https://*.com/questions/40914696/how-do-i-build-docker-images-when- my-development-environment-mounts-my-codebase) – Matt

正如你应该试着瞄准最佳实践使用一个Dockerfile来避免不同环境之间的意外错误。然而,你可能有一个用例,你不能这样做。

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

创建一个shell脚本,称为install.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 
... 

当在构建通过构建ARG指定环境,例如:

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

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

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

# .... 

,第二个:

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

RUN composer install 

在呼吁构建命令,你可以知道哪些文件应该使用:

$> docker build -t mytag . 
$> docker build -t mytag-production -f Dockerfile.production . 
+0

对不起,我读过你现在正在做的! 但您也可以使用ENV变量,如下所示:https://*.com/a/34545644/6849366 –