解决涉及容器共享的依赖资源的 Docker 组合场景?

gre*_*emo 6 docker docker-compose docker-volume

我正在学习 Docker,面临以下问题,主要与服务之间共享文件有关。我准备了一个例子:

插图

我的程序有 3 个阶段Dockerfilebuilderphpcaddy。我docker-compose.yml 定义了 2 个服务phpcaddy(目标是 中的相应阶段Dockerfile)。要求:

  1. 构建器阶段在运行时生成 php 服务所需的一些文件(即public/build/metatada.json
  2. 构建器阶段在运行时生成 caddy 服务所需的一些文件(即public/js/foo.js
  3. php 阶段生成一些在运行时可供球童服务使用的文件(即public/bundles/foo.js
  4. caddy 服务必须public/与 php 服务共享文件夹,因为可以创建新文件(即 user public/uploads/newfile.pdf
  5. 必须考虑源代码中的新静态文件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也很好)。

编辑:如果运行时需要这些文件,您也可以在入口点编写等待脚本。