跨Docker容器共享预编译资产

时间:2015-03-09 20:27:10

标签: ruby-on-rails nginx docker

我有一个与我的rails容器分开的nginx容器,并希望能够使用nginx容器从rails提供预编译资产。这听起来像卷容器的工作,但我很快就需要学习docker并无休止地阅读文档。有人不得不处理类似的情况吗?

4 个答案:

答案 0 :(得分:17)

我有同样的问题。这就是我目前正在做的事情:

选项1:对nginx和app

使用单个图像

这样,我可以构建一次图像(使用app,预编译资产和nginx),然后运行它的两个实例:一个运行app服务器,另一个运行nginx前端:

docker build -t hello .
docker run --name hello-app hello rackup
docker run --name hello-web -p 80:80 --link hello-app:app hello nginx

不漂亮,但很容易设置和升级。

选项2:使用共享卷,并将资产预编译为作业

共享卷无法在构建过程中更新,但可以由容器实例更新。因此,我们可以在运行应用程序之前运行我们的rake任务来预编译资产:

docker build -t hello .
docker run -v /apps/hello/assets:/app/public/assets hello rake assets:precompile
docker run --name hello-app hello rackup
docker run --name hello-web -p 80:80 --link hello-app:app -v /apps/hello/assets:/usr/share/nginx/html/assets nginx

这看起来像一个更强大的选项,但需要更复杂的检测。但是,我倾向于这个选项,因为我们无论如何都需要一个单独的数据库迁移工作。

选项3:在构建时将资产分配给CDN

您的Dockerfile可以将生成的资产直接上传到CDN。然后配置Rails应用程序以将其用作asset_host。类似的东西:

RUN rake assets:precompile && aws s3 sync public/assets s3://test-assets/

我目前正在尝试使用此选项。由于我使用的是Amazon CloudFront,看起来我可以使用AWS CLI将生成的资产同步到S3。还有一个宝石(asset_sync),但看起来很陈旧。

缺点是您必须将所需的AWS凭据发送到构建上下文或Dockerfile本身 - 如果您正在使用自动构建,则可能需要将它们提交到源存储库。 / p>

答案 1 :(得分:5)

我建议在Docker容器内部预编译资产,因为在这种情况下你可以毫无问题地将它运行到任何环境,否则在运行docker容器之前你应该将共享的预编译资产复制到新环境,安装它们并且只有在它运行docker容器之后

另一个与资产版本相关的问题。我的意思是你的代码必须使用与它兼容的资产,否则你将遇到CSS和JS的不同问题。所以,这是你应该在Docker容器中预编译资产的第二点。

答案 2 :(得分:0)

对于制作,@ max是正确的:您应该将编译后的资源添加到图像中。但是,为了发展,我认为你是对的。使用以下使用的卷容器:

  • 用于存储预编译资产的rails容器
  • 用于提供资产的nginx容器

另一种方法是将主机目录安装到容器中。

您可以在Managing Data in Containers User Guide

中找到更多帮助

答案 3 :(得分:0)