【问题标题】:How to map a docker containers directory to the host with docker-compose?如何使用 docker-compose 将 docker 容器目录映射到主机?
【发布时间】:2019-12-03 14:25:07
【问题描述】:

鉴于以下 docker-compose.yml 设置:

version: '3.7'

services:
  reverse:
    container_name: nginx-reverse-proxy
    hostname: nginx-reverse-proxy
    image: nginx:stable
    ports:
      - 80:80
      - 433:433
    volumes:
      - type: bind
        source: ./config
        target: /etc/nginx
        consistency: consistent

这导致./config 文件夹被映射到容器nginx-reverse-proxy,因此在容器内的一个空的/etc/nginx 目录中。

目标
将文件夹容器映射到主机。在我的示例中 from 容器 /etc/nginx to 主机 ./config

我当前的搜索不断导致将目录主机映射到容器(我不想要)。

感谢任何提示/解决方案。谢谢!

我目前的解决方案很丑: 我用 docker 创建了容器,并将文件从/etc/nginx 复制到./config。移除容器并使用 docker-compose up 有效,nginx 启动,因为所需的文件已经在主机上。

编辑:创建时该文件夹不存在。 Docker compose 正在按照文档中的说明创建文件夹。

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    阅读自:Dockers Volume Page

    与绑定挂载相比,卷有几个优点:

    新卷可以通过容器预先填充其内容。


    所以一个简单的 docker-compose(在一个名为 nginx 的文件夹中):

    version: "3.7"
    volumes:
      xmpl:
    
    services:
      testnginx:
        image: nginx:stable
        volumes:
          - xmpl:/etc/nginx
    

    将通过以下方式生成主机系统上的所有文件:

    $ docker-compose up
    $ docker inspect nginx_xmpl
    ...
    "Mountpoint": "/var/lib/docker/volumes/nginx_xmpl/_data"
    

    然后您可以查看主机上的文件:

    # ls /var/lib/docker/volumes/nginx_xmpl/_data                               
      conf.d       fastcgi_params koi-utf    koi-win  
      mime.types   modules        nginx.conf scgi_params    
      uwsgi_params win-utf
    

    最后从 ./config 中使用它:

    # ln -s /var/lib/docker/volumes/nginx_xmpl/_data ./config
    # ls config
      conf.d       fastcgi_params koi-utf    koi-win  
      mime.types   modules        nginx.conf scgi_params    
      uwsgi_params win-utf
    

    【讨论】:

    • 谢谢你泰勒。这就是我要找的!简短、简单、清晰。
    • 这确实有效,但我相信这是一个“仅启动”的解决方案。如果/当您更新容器中的文件时,它们将不会出现在主机上,直到您返回并删除卷并让 docker 在docker-compose up 的过程中重新创建它。如果你不这样做,主机文件总是“挂载在”容器文件上。我使用这个解决方案,但并不理想。
    【解决方案2】:

    一般来说,这是不可能的,因为容器只是“可运行的图像”,并且像 fs 中的一批 zip 文件一样存储。在运行事件中,它们被展平为一个“文件夹”,Linux 核心在其中执行 chroot 并使用此根启动进程。

    您可以在进程结束时将一些路径从主机操作系统映射到chrooted folder 中的一些路径,但不能返回。当 Docker 进行映射时,replaces 路径完全,因此路径中的所有现有文件将从映像 fs 中“隐藏”并被映射的主机路径“替换”。

    我认为您想查看图像中路径的“默认文件配置”。从我的角度来看,有两种方法:

    • 使用映射到另一个目录的路径启动一个容器,当您的容器启动时,只需使用容器外壳将所需的文件夹内容复制到映射的文件夹。示例:让我们将 /export 映射到主机的 ./exported-configs 并在容器启动时使用 docker exec {.... extra params and docker ps id} bash 进入正在运行的容器并运行类似 cp -R /etc/nginx /export/nginx-configs 的内容。
    • 使用https://docs.docker.com/engine/reference/commandline/export/ 导出整个图像文件系统并查看有趣的图像配置等等。

    这两种方法都有效,通常,如果我需要图像中的任何文件夹,我会使用第一种方法。

    祝你好运!

    【讨论】:

      【解决方案3】:

      好吧,您不应该按照您的方式进行映射,因为正如您所说的那样它很难看。 最方便、最省心的方法是这样的:

      version: '3.7'
      
          services:
            reverse:
              container_name: nginx-reverse-proxy
              hostname: nginx-reverse-proxy
              image: nginx:stable
              ports:
                - 80:80
                - 433:433
              volumes:
                - ./nginx-conf/myapp/nginx.conf:/etc/nginx/nginx.conf
                - ./nginx-conf/myapp/sites-enabled:/etc/nginx/sites-enabled
      
      
          volumes:
            nginx-conf:
          networks:
            myapp-net:
              driver: bridge
      

      /etc/nginx 位置还包含其他文件(例如 mime.types 和 fastcgi_params),如果您映射主机目录 ./config,这些文件将不存在,当然,除非您将它们复制到主机,但这不是一个很好的解决方案。

      上面,我只是将位于 /nginx/myapp 文件夹中的本地 nginx.conf 文件映射到 /etx/nginx/nginx.conf 并将本地启用站点的文件夹映射到 /etc/nginx/sites-enabled 文件夹中容器。

      让事情尽可能简单会更好,因为 docker 本质上已经很复杂了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-03
        • 2019-02-08
        • 2022-08-17
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        • 1970-01-01
        • 2020-05-27
        相关资源
        最近更新 更多