2017-04-22 50 views
0

我正尝试使用docker-compose将我的本地目录挂载到我的docker容器上的根级别的新目录中。据说这是一件很简单的事情。无法在docker中挂载音量

这就是我的搬运工,撰写文件看起来像:

version: '2' 
services: 
    web: 
    build: ./docker/web/ 
    expose: 
     - 80 
    volumes: 
     - .:/contracts 

的Dockerfile在泊坞窗/网络字面上看起来像这样(我计划更晚做):

FROM php:5.6-apache 
RUN /contracts/provision/web.sh 

但我继续收到无法找到web.sh的错误。在我的Dockerfile中放入各种ls命令等,表明在该容器上不会创建名为“contracts”的这样的目录。如果我尝试直接使用现有的mnt,我会得到相同的结果 - 目录保持空白。

docker inspect表明它显然已安装!

"Mounts": [ 
    { 
     "Type": "bind", 
     "Source": "/vagrant", 
     "Destination": "/contracts", 
     "Mode": "rw", 
     "RW": true, 
     "Propagation": "" 
    } 
], 

我在运行Ubuntu 14.04的流浪盒上运行docker-compose。

任何帮助将非常感激,我在我的系绳的末尾。谢谢!

回答

3

卷被附加到容器,容器是从图像创建的,图像是从构建命令创建的。在运行构建时,卷挂载将不存在,因此在RUN命令期间不会看到它。

在编译时,不是挂载音量,而是将COPYADD这个目录放入镜像中。你会包括像这样在你的Dockerfile的RUN命令之前:

COPY . /contracts 

请注意,如果你这样做,并在同一位置装入卷在运行时,您将隐藏在该位置的图像内的任何存在。因此,将需要成为图像一部分的命令和脚本从需要成为持久性卷的一部分的数据中分离出来,并且仅将构建时间脚本复制到映像中。

使用正在运行的容器,可以尝试docker exec -it $container_id ls /contracts以查看它是否按预期那样存在。

如果目录存在但是为空,最有可能的原因是如果您在VM或远程主机上有Docker,并且您正在从不同的环境运行命令。该文件夹需要存在于泊坞窗主机(VM)本身上才能安装到容器中。 Win的Docker for Mac和Docker for Mac具有共享特定文件夹或驱动器到虚拟机的设置,如果您在不同于预期的位置进行构建,可能需要进行调整。并且要注意适用于linux文件名的区分大小写。

+0

感谢您的回复。我能够像这样获得我的供应脚本。但是,在我尝试使用docker exec -it $ container_id ls/contracts之后,它仍然没有安装(只有“provision”目录存在于该位置)。我现在没有流浪,本来就在尝试它。有任何想法吗? – Raiden616