gre*_*emo 6 docker docker-compose docker-volume
我正在学习 Docker,面临以下问题,主要与服务之间共享文件有关。我准备了一个例子:
我的程序有 3 个阶段Dockerfile
:builder、php和caddy。我docker-compose.yml
定义了 2 个服务:php和caddy(目标是 中的相应阶段Dockerfile
)。要求:
public/build/metatada.json
)public/js/foo.js
)public/bundles/foo.js
)public/
与 php 服务共享文件夹,因为可以创建新文件(即 user public/uploads/newfile.pdf
)public/img/newimage.png
(即)解决方案 1:我的第一个天真的解决方案不起作用,因为第 4 点: caddy 服务无法访问php 服务在运行时创建的资源(即public/uploads/new.png
):
FROM node:current-alpine as builder
WORKDIR /app
COPY . .
RUN npm run build
FROM php:fpm-latest as php
COPY . .
COPY --from=builder /app/public/ public/
FROM caddy:latest as caddy
WORKDIR /srv
COPY --from=builder /app/public/ public/
Run Code Online (Sandbox Code Playgroud)
解决方案2:将挂载源代码public
文件夹绑定到caddy/srv/public
和php/var/www/html/public
文件夹。这解决了 4 和 5,但完全擦除了构建器输出,因此不考虑第 1、2、3 点。
我还有什么选择?我已经尝试共享一卷(请参阅我的其他问题),但它也不起作用。
小智 0
如果我对这种方法也很天真,请原谅我,我也读过你的其他问题。只是一个尝试的建议。
如果找不到某个文件,您是否无法将两个公用文件夹的内容保留在容器中的其他位置,使用解决方案 2 并在启动后使用每个容器中的入口点脚本加载容器的公用文件夹内容?这样,绑定就不会掩盖任何内容,并且您仍然拥有所有文件。
就像是:
入口点.sh
...
while [ ! -e "/app/public/bundles/foo.js" ];do
cp -r /apptmp/public/* /app/public/
break;
done
...
Run Code Online (Sandbox Code Playgroud)
其中/apptmp/public
包含构建过程中生成的文件,/app/public
是挂载的目录。
(我用过while
,但if
也很好)。
编辑:如果运行时需要这些文件,您也可以在入口点编写等待脚本。
归档时间: |
|
查看次数: |
269 次 |
最近记录: |