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

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

由于挂载的目录只在运行docker容器时可用,所以我不能在dockerfile中放置“composer install”或“npm install”这样的命令进行开发。

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

我正在努力实现的是

在docker文件中

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

在dockerbuild造期间

 docker build [PROD] -t mytag . 

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

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

创build一个名为install.sh的shell脚本,其function如下:

 if [ ${ENV} = "DEV" ]; then composer install else npm install fi 

在你的Dockerfile中添加这个脚本,然后在构build时执行它

 ... COPY install.sh install.sh RUN chmod u+x install.sh && ./install.sh ... 

在构build传递构buildarg来指定环境时,例如:

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

您可以使用两个不同的Docker文件。

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