我在组合文件中有2个容器,我想通过nginx为应用提供静态文件。
我已阅读以下内容:https://stackoverflow.com/a/43560093/7522096,并且由于某些原因,我不想使用命名卷,所以希望使用主机目录在应用程序容器和nginx容器之间共享。
===
使用主机目录或者,您可以在主机上使用目录 并将其安装到容器中。这有你的优势 能够使用外部工具直接处理文件 Docker(例如您的GUI文本编辑器和其他工具)。
是一样的,只不过您没有在Docker中定义卷,而是 挂载外部目录。
version: '3'
services:
nginx:
volumes:
- ./assets:/var/lib/assets
asset:
volumes:
- ./assets:/var/lib/assets
===
我的docker-compose文件:
version: "3.7"
services:
app:
container_name: app
restart: always
ports:
- 8888:8888
env_file:
- ./env/app.env
image: registry.gitlab.com/app/development
volumes:
- ./public/app/:/usr/app/static/
- app-log:/root/.pm2
nginx:
container_name: nginx
image: 'nginx:1.16-alpine'
restart: always
ports:
- 80:80
- 443:443
volumes:
- /home/devops/config/:/etc/nginx/conf.d/:ro
- /home/devops/ssl:/etc/nginx/ssl:ro
- ./public/app/:/etc/nginx/public/app/
depends_on:
- app
volumes:
# app-public:
app-log:
但是,当我在撰写此文件时,dir总是在nginx上变为空,并且我的应用容器中的静态文件也消失了。
请帮助,我尝试了很多方法,但无法弄清楚。
谢谢。
答案 0 :(得分:0)
在容器初始化期间,泊坞窗会将主机上的./public/app
目录与容器中的/usr/app/static/
目录绑定。
如果./public/app
不存在,将创建它。绑定是从主机到容器,这意味着./public/app
文件夹的内容是
反映(复制)到容器中,反之亦然。因此,初始化后静态应用程序目录为空。
如果我的理解正确,那么您的目标是在应用容器和nginx
之间共享应用文件。
考虑到上述情况,唯一的解决方案是在创建卷之后在卷中创建文件。这是相关部分的示例:
version: "3"
services:
app:
image: ubuntu
volumes:
- ./public/app/:/usr/app/static_copy/
entrypoint: /bin/bash
command: >
-c "mkdir /usr/app/static;
touch /usr/app/static/shared_file;
mv /usr/app/static/* /usr/app/static_copy;
rm -r /usr/app/static;
ln -sfT /usr/app/static_copy/ /usr/app/static;
exec sleep infinity"
nginx:
image: 'nginx:1.16-alpine'
volumes:
- ./public/app/:/etc/nginx/public/app/
depends_on:
- app
这会将静态文件移动到static_copy
目录,并将这些文件链接回/usr/app/static
。这些文件将与主机(public/app
主管)共享
和nginx
容器(/etc/nginx/public/app/
)。对其进行调整以适合您的需求。
当然,您也可以使用命名卷。 希望对您有帮助