将../与docker-compose卷一起使用

时间:2018-06-26 18:35:21

标签: docker docker-compose

从Docker容器内部将文件写出到我的主机时遇到问题。我认为这是一个特权问题,因此最好不要设置privileged: True。解决方法是将../放在我的docker-compose.yml文件中的卷之前。例如,

version: '3'
services:
    example:
        volumes:
         - ../:/example

../在这里到底在做什么?它是否从容器的特权中获取并“向上”到主机的目录?没有../,我将无法写出文件到主机。

2 个答案:

答案 0 :(得分:6)

除非您将更高目录指定为上下文,否则docker build命令只能访问其所在目录和更低目录,而不能访问更高目录。

要从父目录运行docker构建:

docker build -f /home/me myapp/Dockerfile 

在作曲家中做同样的事情:

 #docker-compose.yml
 version: '3.3'    
 services:
   yourservice:
     build:
       context: /home/me
       dockerfile: myapp/Dockerfile

或以您的示例为例:

 version: '3'
 services:
     build: 
        context: /home/me/app
        dockerfile: docker/Dockerfile
     example:
        volumes:
          - /home/me/app:/example

此外,您必须提供完整路径,而不是相对路径。就是

- /home/me/myapp/files/example:/example 

如果您有一个脚本从未知路径生成Dockerfile,则可以使用:

CWD=`pwd`; echo $CWD

引用当前工作目录。从那里可以添加..

或者,您可以从一个目录建立映像,或者使用可以与从更高目录运行的映像共享的卷,或者需要将文件输出到stdout并重定向命令的输出从运行它的脚本中找到所需的文件。

另请参阅:Docker: adding a file from a parent directory

答案 1 :(得分:2)

语句volumes: ['../:/example']使主机(docker-compose.yml)上包含../的目录的父目录在/example的容器内可见。这样的主机目录绑定安装以及附加到特定主机目录的一些equivalent constructs using a named volume是容器可以写出到主机文件系统的 only 方法。