我目前正在尝试通过Docker部署一个PHP应用程序。堆栈是Caddy -〉PHP-FPM,并且我为每个组件使用单独的容器。
由于这些组件的工作方式,Caddy和php-fpm容器都需要看到应用程序代码。(理论上,我可以只向php-fpm提供PHP文件,只向Caddy提供静态文件,但这太痛苦了。)因此,我用应用程序代码挂载一个卷,并将其放在两个容器上。
只要该卷在构建时不存在,就可以正常工作。但是,如果该卷已经存在,则会使用该卷上的数据,并且不会将新版本的应用复制到其中。我发现的唯一方法是每次构建时手动docker volume rm
该卷,这很痛苦,似乎不是正确的方法。
如何在构建时自动覆盖现有的卷内容?或者,如何在没有卷的情况下在两个容器之间共享代码?显然tmpfs挂载不能共享,所以这不好。
2条答案
按热度按时间qjp7pelc1#
如何在没有卷的情况下在两个容器之间共享代码?
构建你自己的Caddy和php-fpm容器,其中包含来自两个Dockerfile的代码,作为自动CI/CD部署的一部分,从存储库中存储你的代码作为CI/CD管道的一部分。两个容器将具有与相同代码版本关联的相同:tag,例如:tag等于git commit messages或build timestamp。然后,使用相同的docker tag将两个容器部署在一起。
如何在生成时自动覆盖现有卷的内容?
卷在构建时不存在。当 * 运行 * 应用程序时,您可以启动第三个容器,其中包含具有基本shell实用程序的代码(busybox)并在其他两个之前启动。此容器仅将代码复制到共享存储中并退出。通常情况下这样“app-init”容器作为docker-composer部署的一部分运行,且其它容器等待它们的成功终止。例如,请参见airflow docker-compose,它在运行其他气流组件之前初始化气流数据库。
xzv2uavs2#
正如在这个docker-compose-issue中提到的,你可以在
up
命令之前尝试docker-compose down -v -f
,这应该会删除在up
进程中创建的卷。