Docker部署更新共享卷

在生产中使用Docker的新东西我有一个devise问题。 什么是使用Docker部署一个PHP应用程序的最佳方法,该应用程序包含主应用程序目录中其他容器所使用的数据和信息,这些容器必须通过构build进行更新?

示例(简化Symfony类应用程序):

- application - app - src - vendor - conf - conf/vhost.conf - web/assets/* 

让我们简化只有2个服务

 - php-fpm - nginx 

1 /第一次尝试是build立2个图像

  • php-fpm:与

ADD。 在/ var / www / html等/项目/

VOLUME / var / www / html / project /

供应商(composer php)安装在Dockerfile中

这样我就可以到达/ var / www / html / project / on nginx

volumes_from php-fpm

=>然后configuration和资产等

但如果我没有错,这不是一个好方法,因为在下一个版本中,我的图像不会更新VOLUME / var / www / html / project /(因为它是一个卷)=>那么我的代码将会永远不会被更新。

2 /然后,我结束了这样做:

 - providing the last code base in the image: COPY . /data/image/app - creating a named volume: docroot - mount docroot on php-fpm - adding a rsync on the entrypoint to sync /data/image/app to docroot:/var/www/html/project ( with the good excludes that I needed) - doing the vendors(composer) install in the entrypoint 

=>在nginx上仍然使用volumes_from:php-fpm。

这是重要的,因为我想:

 - the conf/vhost.conf - the assets - maybe other stuff 

我可能需要添加一个SolR来使用一些configuration文件和/或资源等。

3 /我想还有另外一种方法可以在每张图片上加上我所需要的东西。

我认为这增加了构build过程的复杂性,但也是很有意义的。

那么,你觉得我错过了什么? 方法2 /或3 /,4?

非常感谢你!

你的问题真的是关于静态文件资产。 一些框架和项目对待这些非常像他们自己的组件。 在PHP世界中,php-fpm应用程序服务器通常不处理静态文件。 这留下了像nginx这样的networking服务器组件。 这本身就不是问题。 其实这是很好的做法。

它的唯一原因是你正在介绍一个php-fpm和nginx之间的隔离层。

如果我们考虑另一个非docker,在php-fpm和nginx之间引入隔离的情况,我们会遇到同样的问题。 在这个例子中,我将让我的nginx服务器在我的数据中心的DMZ中运行,而php-fpm将作为数据中心防火墙后面的应用服务器。 那个nginx如何提供这个php项目的静态文件?

我提到静态资产几乎可以被认为是自己的组件。 在这个双节点的例子中,部署过程中的一个单独的步骤可以用来填充DMZ中的nginx服务器上的静态文件。 这与您的解决scheme#2没有什么不同,您运行rsync来填充php-fpm和nginx容器都可以访问的卷。

另一个解决scheme是使php-fpm处理这些静态资产。 这当然不被认为是最好的做法,因为php-fpm不是为了提供静态文件而构build的。 它可以完成,但是它没有被优化。 使用nginx文件caching可以缓解这种性能下降。

你的#3解决scheme也是可行的。 你也可以让你的项目build立两个图像,而不是一个。 第一个将是你的正常的PHP图像,所有的PHP代码添加。 第二个将基于nginx基本映像,并且只添加项目需要的静态文件。

尽pipe这不是最佳实践,但在某些项目中,可能适合在同一个容器中运行nginx和php-fpm。 如果你的nginxconfiguration字面上只是提供静态文件和反向代理到php-fpm,那么你可以把这对进程作为一个逻辑服务。 您需要运行supervisord,runit或类似的进程pipe理器。