如何使用docker-compose将docker容器目录映射到主机?

时间:2019-12-03 14:25:07

标签: docker docker-compose

给出以下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中将文件夹beeing映射到容器nginx-reverse-proxy,因此在容器上的空/etc/nginx目录中。

正如我的问题中所述,目标是查看内容(由图像创建)的容器,并使该内容对在./config上的主机可见

我当前的搜索不断地导致如何将Directoy从主机映射到容器(我不想要)。

任何提示/解决方案都值得赞赏。谢谢!

我当前的解决方案很丑: 我使用docker创建了容器,并将文件从/etc/nginx复制到./config。删除容器并使用docker-compose up可以正常工作,并且nginx开始运行,因为所需的文件已经在主机上。

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

5 个答案:

答案 0 :(得分:3)

阅读来自: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

答案 1 :(得分:0)

据我了解,您想要一种使用docker-compose文件将文件从docker容器传输到主机的方法。您应该尝试如下更改音量:

volumes:
      - /path/to/folder/on/container:/host/folder/path

作为参考,您应该看一看已经与您的问题相似的问题:https://stackoverflow.com/a/53930043/12485228

希望对您有帮助。

答案 2 :(得分:0)

通常,这是不可能的,因为容器只是“可运行的映像”,并且像一批zip文件一样存储在fs中。在运行事件中,它们被压平成一个“文件夹”,Linux内核在其中执行chroot,并使用该根目录启动进程。

可选地,您可以在过程结束时将从主机OS的某些路径映射到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 :(得分:0)

嗯,您不应该按照自己的方式进行映射,因为您说它很丑。 最方便,最轻松的方式是这样的:


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

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

使事情尽可能简单会更好,因为Docker已经天生就复杂了。

答案 4 :(得分:-1)

不太可能。 Docker卷已安装到容器中。反之亦然。这里可能的替代方法:https://stackoverflow.com/a/41914917/5586914