Docker-compose - 如何将一个容器的数据填充到另一个容器中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker-compose - 如何将一个容器的数据填充到另一个容器中?相关的知识,希望对你有一定的参考价值。

我的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的解释 docker-compose.yaml: 后台容器在这里设置django项目,并使用uwsgi为项目服务,使用相同的镜像,迁移容器将收集所有app目录下的静态文件,并将其填充到容器的当前工作目录中。前端容器是一个nginx,作为反向代理。我也想从nginx容器中获取静态文件。

这里我面临的问题是,我想让迁移容器创建的静态文件出现在前端容器中。这样nginx就可以提供静态文件。如何做到这一点?如果假设设计不应该是这里的样子,请建议我如何重新设计来实现这个要求?

我知道使用共享卷可以做到这一点。但是,我不想使用共享卷,因为填充到共享卷的数据将持久存在其中,如果开发人员修改应用程序文件夹中的静态内容,更改将不会填充到卷中,除非卷挂载点被刷新。这是基于我所理解的,如果我错了,请纠正我。

答案

无论在docker层为你的资源提供服务的是什么--gunicorn,uwsgi,还是什么--都可能支持为静态资产提供服务,而且比django本身的效率高得多。

在你的情况下。nginx 本质上是你的应用程序的外部。 而不是试图 "把你的静态资产放到nginx中",让客户端来完成这项工作,并且 缓存 他们在nginx中一旦被代理。 Nginx有很好的缓存支持。

如果你真的想把静态资产放到一个,你可以 COPY --from=... 如同 https:/docs.docker.comdevelopdevelop-imagesmultistage-build。 复制静态资产到你的自定义nginx容器中。 使用django容器作为源码--你必须确保它是内置的。之后 你的django容器。 这在docker-compose中可能无法完全实现。 这里面有合理的摩擦;如果你试图构建和部署docker工件到生产服务器上,你也会有同样的摩擦。

以上是关于Docker-compose - 如何将一个容器的数据填充到另一个容器中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将映像创建的卷与 docker-compose 指定的命名卷链接?

如何使用 docker-compose.yml 和 ecs-cli 将 EBS 卷附加到我的容器

使用 docker-compose 时如何在容器内使用主机用户修改卷文件

当 docker-compose 的一部分时,自定义 nginx 容器立即退出

在此示例中,如何使用 docker-compose 允许 2 个容器正确共享 .sock 文件?

如何使用 docker-compose 重启单个容器