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。