我正在尝试使用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
命令等表明没有这样的目录叫做" contract"正在容器上创建。如果我尝试使用像mnt
那样的直接存在,我会得到相同的结果 - 目录仍为空。
但是docker inspect
显示它显然已经安装了!
"Mounts": [
{
"Type": "bind",
"Source": "/vagrant",
"Destination": "/contracts",
"Mode": "rw",
"RW": true,
"Propagation": ""
}
],
我在运行Ubuntu 14.04的流浪盒上运行docker-compose。
任何帮助都会非常感激,我在我的系绳的最后。谢谢!
答案 0 :(得分:4)
卷附加到容器,容器是从映像创建的,图像是从构建命令创建的。当您正在运行构建时,卷装置不会存在,因此您在RUN
命令期间无法看到它。
在构建时,您可以COPY
或ADD
将此目录放入图像中,而不是装入卷。您可以在RUN
命令之前在Dockerfile中包含类似的内容:
COPY . /contracts
请注意,如果您这样做并在运行时在同一位置安装卷,则会隐藏该位置图像内的任何内容。因此,需要成为图像一部分的命令和脚本的哪些部分需要成为持久卷的一部分,并且只将构建时脚本复制到图像中。
使用正在运行的容器,您可以尝试docker exec -it $container_id ls /contracts
查看它是否按预期存在。
如果目录存在但是为空,则最可能的原因是您在VM或远程主机上安装了docker,并且您正在从其他环境运行命令。该文件夹需要存在于Docker主机(VM)本身上才能安装到容器中。适用于Win的Docker和适用于Mac的Docker具有将特定文件夹或驱动器共享到VM中的设置,如果您在不同于预期的位置执行构建,则可能需要进行调整。并且要注意适用于linux文件名的区分大小写。