如何使用 docker compose 与 nginx 目录路径共享构建应用程序目录

How to share build app directory with nginx directory path with docker compose

我有一个 React 应用程序,它创建一个构建文件夹作为路径 /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

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

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

检查 docker images 以查看 Compose 分配给构建的 admin 图像的名称,或者将 image: 放入 Docker 文件中以自行设置。

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

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

这里的一个特别复杂的问题是 Compose 不知道一个 image 可以依赖另一个,因此您可能需要在开始其余部分之前手动 docker-compose build admin应用程序 docker-compose up --build.

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