我有一个与我的rails容器分开的nginx容器,并希望能够使用nginx容器从rails提供预编译资产。这听起来像卷容器的工作,但我很快就需要学习docker并无休止地阅读文档。有人不得不处理类似的情况吗?
答案 0 :(得分:17)
我有同样的问题。这就是我目前正在做的事情:
这样,我可以构建一次图像(使用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
不漂亮,但很容易设置和升级。
共享卷无法在构建过程中更新,但可以由容器实例更新。因此,我们可以在运行应用程序之前运行我们的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
这看起来像一个更强大的选项,但需要更复杂的检测。但是,我倾向于这个选项,因为我们无论如何都需要一个单独的数据库迁移工作。
您的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是正确的:您应该将编译后的资源添加到图像中。但是,为了发展,我认为你是对的。使用以下使用的卷容器:
另一种方法是将主机目录安装到容器中。
中找到更多帮助答案 3 :(得分:0)