我在laravel项目的开发和生产中使用docker。我在开发和生产中使用的docker文件略有不同。例如,我在开发环境中将本地目录安装到docker容器中,这样我就不需要为代码的每次更改都进行docker构建。
由于挂载目录只有在运行docker容器时才可用,因此我无法将“composer install”或“npm install”等命令放在dockerfile中进行开发。
目前我正在管理两个docker文件,是否有任何方法,我可以做到这一点与单一的docker文件,并决定哪些命令运行时,做docker建设发送参数。
我想要实现的是
在Docker文件中
...
IF PROD THEN RUN composer install
...
Docker构建期间
docker build [PROD] -t mytag .
5条答案
按热度按时间yqyhoc1h1#
作为一个最佳实践,你应该尝试使用一个Dockerfile来避免不同环境之间的意外错误。然而,你可能有一个用例,你不能这样做。
Dockerfile语法不够丰富,不足以支持这样的场景,但是您可以使用shell脚本来实现。
创建一个名为
install.sh
的shell脚本,执行如下操作:在Dockerfile中添加此脚本,然后在构建时执行它
构建时传递构建参数以指定环境,例如:
xnifntxz2#
**更新(2020):*自从3年前写了这篇文章,很多事情都改变了(包括我对这个主题的看法)。我建议的方法是使用 * 一个dockerfile 和使用脚本。请看@yamenk的回答。
原件:
您可以使用两个不同的Dockerfile。
还有第二个
在调用build命令时,您可以知道它应该使用哪个文件:
w8biq8rn3#
您可以直接使用构建参数,而无需提供额外的sh脚本。尽管看起来可能有点混乱,但它确实有效。
停靠文件必须是这样的:
要检查的命令包括:
jhdbpxl94#
我已经尝试了几种方法,包括使用docker-compose、多阶段构建、通过文件传递参数以及其他答案中使用的方法。我的公司需要一种好的方法来做到这一点,在尝试了这些方法后,我的观点如下。
最好的方法是通过cmd传递arg。您可以在右击并选择构建映像Image of visual studio code while clicking image build时通过vscode传递arg,使用以下代码:
在dockerfile的构建部分中:
n1bvdmb65#
最好的方法是在项目中使用. env文件。您可以定义两个变量CONTEXTDIRECTORY和DOCKERFILENAME,然后创建Dockerfile-dev和Dockerfile-prod
这是使用它的示例:
Docker合成文件:
项目根目录中的. env文件:
注意上下文,它的路径从你指定的dockerfile目录开始,而不是从docker-compose目录开始。
在默认值i中使用prod,因为如果您忘记指定env变量,您将无法意外地在生产中构建dev版本
使用不同文档的解决方案比使用脚本更方便,更容易修改和维护