首页 > 解决方案 > 如何使用 docker compose 与 nginx 目录路径共享构建应用程序目录

问题描述

我有一个反应应用程序,它创建一个构建文件夹作为路径/app/admin/build,我希望这个目录作为卷共享给正在运行的其他 nginx 容器,如下面的 docker-compose.yaml 中所述。我错过了什么吗?我想将应用程序构建目录共享给 nginx。但是,/var/www/admin/build当检查登录到容器但它是空的时,它会被创建。有人能帮忙吗?

Error: *1 directory index of "/app/admin/build/" is forbidden, client: 172.18.x.x, server: _, request: "GET / HTTP/1.1", host: "localhost"

提前致谢

version: '3'
services:
  admin:
    build:
      dockerfile: Dockerfile
      context: ./admin
    volumes:
      - /app/admin/build
  web:
    restart: always
    build:
      dockerfile: Dockerfile
      context: ./nginx
    ports:
      - '80:3000'
    volumes:
      - /app/admin/build:/var/www/admin/build

标签: reactjsdockernginxcontainersdocker-volume

解决方案


我会将这些文件包含在 Nginx 组件的自定义图像中。该COPY --from=...选项通常与多阶段构建一起使用,但您也可以命名预先存在的图像:

FROM nginx
...
COPY --from=project_admin /app/admin/build /var/www/admin/build

检查docker images以查看 Compose 分配给构建admin映像的名称,或放入image:Dockerfile 以自行设置。

然后在 Compose 设置中,您根本不需要volumes:

version: '3.8'
services:
  admin:
    build: ./admin
  web:
    restart: always
    build: ./nginx
    ports:
      - '80:3000'

这里的一个特别复杂之处是 Compose 不知道一个图像可以依赖于另一个图像,因此您可能需要docker-compose build admin在启动应用程序的其余部分之前手动进行docker-compose up --build

通常,从图像中导出文件很棘手。您显示的语法将管理容器的构建目录替换为匿名卷,然后将不相关的主机目录安装到 Web 容器中。有一种涉及 Docker 命名卷的不同语法,但它在其他环境(如 Kubernetes)或主机目录中不起作用,并且它忽略应用程序中的更新。 COPY将文件放入图像中将是最可靠的方法;重新设计您的应用程序以避免这种情况(也许让后端提供自己的静态文件)会更好。


推荐阅读