使用docker-compose在主机和多个容器之间共享目录

时间:2019-08-29 09:13:15

标签: docker nginx docker-compose

我在组合文件中有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上变为空,并且我的应用容器中的静态文件也消失了。

请帮助,我尝试了很多方法,但无法弄清楚。

谢谢。

1 个答案:

答案 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/)。对其进行调整以适合您的需求。

当然,您也可以使用命名卷。 希望对您有帮助