如何为开发和生产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 .