Docker-compose - 如何将一个容器的数据填充到另一个容器?
Docker-compose - How to populate a container data to another container?
我的docker-compose文件如下:
version: '3'
services:
database:
image: postgres
restart: always
environment:
POSTGRES_PASSWORD: qwerty
POSTGRES_USER: qwerty
backend:
depends_on:
- database
build:
#Dockerfile used here will use python image,build the django project and run using uwsgi in port 4000
context: .
dockerfile: dockerfile_uwsgi
ports:
- "4000:4000"
image: backend_img
environment:
DB_HOST: database
DB_NAME: qwerty
DB_USER: qwerty
DB_PASSWORD: qwerty
migration:
depends_on:
- backend
image: backend_img
entrypoint: ["sh", "-c"]
command: ["
python manage.py collectstatic --noinput;
python manage.py makemigrations;
python manage.py migrate;"]
environment:
DB_HOST: database
DB_NAME: qwerty
DB_USER: qwerty
DB_PASSWORD: qwerty
frontend:
depends_on:
- backend
build:
#The dockerfile used her uses nginx image, it is configured to act as reverse proxy and serve static files.
context: .
dockerfile: dockerfile_nginx
ports:
- "9443:8443"
关于docker-compose.yaml
的解释:这里后端容器设置django项目并使用uwsgi为项目提供服务,使用相同的图像迁移容器将从所有应用程序目录收集静态文件并将其填充到当前容器的工作目录。前端容器是一个 nginx,充当反向代理。我也想从 nginx 容器提供静态文件。
我在这里面临的问题是,我想让迁移容器创建的静态文件出现在前端容器中。这样 nginx 就可以为静态文件提供服务。这怎么办?如果假设设计不应该是这里显示的样子,请建议我如何重新设计才能达到要求?
我知道使用共享卷可以做到这一点。但是我不想使用共享卷,因为填充到共享卷的数据将保留在其中,并且假设如果开发人员修改了应用程序文件夹中的静态内容,则更改不会填充到该卷,除非卷安装点被清除.这是我观察到的,如有错误请指正
在 docker 层为您的资源提供服务的任何东西 - gunicorn、uwsgi 等等 - 都可能支持提供静态资产,并且可以比 django 本身更有效地做到这一点。
在您的情况下,nginx
本质上在您的应用程序之外。不要尝试 "get your static assets into nginx",而是让客户端完成这项工作,并在代理后 将它们缓存 在 nginx 中。 Nginx 有很好的缓存支持。
如果您真的想将静态资产放入 ,您可以 COPY --from=...
像 https://docs.docker.com/develop/develop-images/multistage-build/ 一样将静态资产复制到您的自定义 nginx 容器中。使用 django 容器作为源 - 你必须确保它在你的 django 容器 之后构建。这在 docker-compose 中可能无法完全实现。那里有合理的摩擦;您将遇到与尝试构建 docker 工件并将其部署到生产服务器相同的摩擦 when/if。
我的docker-compose文件如下:
version: '3'
services:
database:
image: postgres
restart: always
environment:
POSTGRES_PASSWORD: qwerty
POSTGRES_USER: qwerty
backend:
depends_on:
- database
build:
#Dockerfile used here will use python image,build the django project and run using uwsgi in port 4000
context: .
dockerfile: dockerfile_uwsgi
ports:
- "4000:4000"
image: backend_img
environment:
DB_HOST: database
DB_NAME: qwerty
DB_USER: qwerty
DB_PASSWORD: qwerty
migration:
depends_on:
- backend
image: backend_img
entrypoint: ["sh", "-c"]
command: ["
python manage.py collectstatic --noinput;
python manage.py makemigrations;
python manage.py migrate;"]
environment:
DB_HOST: database
DB_NAME: qwerty
DB_USER: qwerty
DB_PASSWORD: qwerty
frontend:
depends_on:
- backend
build:
#The dockerfile used her uses nginx image, it is configured to act as reverse proxy and serve static files.
context: .
dockerfile: dockerfile_nginx
ports:
- "9443:8443"
关于docker-compose.yaml
的解释:这里后端容器设置django项目并使用uwsgi为项目提供服务,使用相同的图像迁移容器将从所有应用程序目录收集静态文件并将其填充到当前容器的工作目录。前端容器是一个 nginx,充当反向代理。我也想从 nginx 容器提供静态文件。
我在这里面临的问题是,我想让迁移容器创建的静态文件出现在前端容器中。这样 nginx 就可以为静态文件提供服务。这怎么办?如果假设设计不应该是这里显示的样子,请建议我如何重新设计才能达到要求?
我知道使用共享卷可以做到这一点。但是我不想使用共享卷,因为填充到共享卷的数据将保留在其中,并且假设如果开发人员修改了应用程序文件夹中的静态内容,则更改不会填充到该卷,除非卷安装点被清除.这是我观察到的,如有错误请指正
在 docker 层为您的资源提供服务的任何东西 - gunicorn、uwsgi 等等 - 都可能支持提供静态资产,并且可以比 django 本身更有效地做到这一点。
在您的情况下,nginx
本质上在您的应用程序之外。不要尝试 "get your static assets into nginx",而是让客户端完成这项工作,并在代理后 将它们缓存 在 nginx 中。 Nginx 有很好的缓存支持。
如果您真的想将静态资产放入 ,您可以 COPY --from=...
像 https://docs.docker.com/develop/develop-images/multistage-build/ 一样将静态资产复制到您的自定义 nginx 容器中。使用 django 容器作为源 - 你必须确保它在你的 django 容器 之后构建。这在 docker-compose 中可能无法完全实现。那里有合理的摩擦;您将遇到与尝试构建 docker 工件并将其部署到生产服务器相同的摩擦 when/if。