reactjs - 如何使用 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
解决方案
我会将这些文件包含在 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
将文件放入图像中将是最可靠的方法;重新设计您的应用程序以避免这种情况(也许让后端提供自己的静态文件)会更好。
推荐阅读
- javascript - 如何遍历网页上元素的数组值
- r - 如何在函数中添加函数?
- c - 无法理解 C 中的位域
- terraform - Terratest:更改 InitAndApply 中传递变量的顺序
- java - 通过 Visual Studio Code 导出 JAR 时按项目指定 java 版本
- python - 实时人脸识别:PermissionError: [Errno 13] Permission denied:
- saucelabs - 如何故意让我的浏览器在 SauceLabs 上变慢?
- javascript - Javascript嵌套循环崩溃浏览器
- delphi - Paradox BCD 字段 - 数字超出范围错误
- vue.js - 传单地图 Vue