无法在docker中挂载卷

我正在尝试使用docker-compose来装载我的本地目录在我的docker容器上的根级别的新目录。 据说这是一件相当简单的事情。

这就是我的docker-compose文件的样子:

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

docker / web中的Dockerfile字面上看起来像这样(我打算以后做更多):

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

但是我一直收到web.sh找不到的错误。 在我的Dockerfile中放入各种ls命令和类似的东西,显示在容器上没有创build一个名为“contracts”的目录。 如果我直接尝试一个现有的mnt ,我会得到相同的结果 – 目录保持为空。

但是一个docker inspect显示它显然已经安装了!

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

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

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

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

在构build时,不是安装卷,而是将COPYADD目录添加到映像中。 在RUN命令之前,你可以在你的Dockerfile中包含这样的内容:

 COPY . /contracts 

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

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

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