如果您有以下情况,Docker documentation建议使用ONBUILD
指令:
例如,如果您的映像是可重用的python应用程序构建器,则需要将应用程序源代码添加到特定目录中,并且可能需要在此之后调用构建脚本。您现在不能只调用ADD和RUN,因为您还无法访问应用程序源代码,并且每个应用程序构建都会有所不同。您可以简单地为应用程序开发人员提供一个样板Dockerfile来复制粘贴到他们的应用程序中,但这样做效率低,容易出错且难以更新,因为它与特定于应用程序的代码混合在一起。
基本上,这一切听起来都不错,但这确实意味着我每次更改内容时都必须重新创建应用容器,即使它只是一个错字。
这似乎不是非常有效,例如在创建用于在浏览器中更改内容,保存和点击刷新的Web应用程序时。
你是如何处理的?
答案 0 :(得分:81)
意味着每次我改变某些东西时都必须重新创建app容器,即使它只是一个错字
不一定,您可以使用-v
选项将docker run
命令注入项目文件放入容器中。因此,您不必重建docker镜像。
请注意,ONBUILD
指令适用于Dockerfile继承父级Dockerfile FROM
的情况。当Docker构建子Dockerfile的映像时,将运行父Dockerfile中的ONBUILD
指令。
这似乎不是非常有效,例如在创建用于在浏览器中更改内容,保存和点击刷新的Web应用程序时。
如果您在迭代应用程序代码时使用Docker容器来提供Web应用程序,那么我建议您创建一个特殊的Docker镜像,其中只包含运行应用程序但应用程序代码的所有内容。
然后在主机上共享包含应用程序代码的目录,其中包含在docker容器中提供应用程序文件的目录。
例如,如果我正在开发静态网站并且我的工作区位于/home/thomas/workspace/project1/
,那么我将启动一个运行nginx的容器:
docker run -d -p 80:80 -v /home/thomas/workspace/project1/:/usr/local/nginx/html:ro nginx
这样我可以更改/home/thomas/workspace/project1/
中的文件,并且无需重建docker镜像甚至重新启动docker容器即可实时更改更改。