Php 无法在docker中装入卷

Php 无法在docker中装入卷,php,linux,docker,vagrant,ubuntu-14.04,Php,Linux,Docker,Vagrant,Ubuntu 14.04,我正在尝试使用docker compose将本地目录装载到docker容器根级别的新目录。据推测,这是一件非常简单的事情 这就是我的docker compose文件的外观: 版本:“2” 服务: 网状物: 构建:./docker/web/ 揭露: - 80 卷数: -.:/合同 docker/web中的Dockerfile实际上是这样的(我计划稍后再做): 来自php:5.6-apache 运行/contracts/provision/web.sh 但是我一直得到一个错误,web.sh找不到

我正在尝试使用docker compose将本地目录装载到docker容器根级别的新目录。据推测,这是一件非常简单的事情

这就是我的docker compose文件的外观:

版本:“2”
服务:
网状物:
构建:./docker/web/
揭露:
- 80
卷数:
-.:/合同
docker/web中的Dockerfile实际上是这样的(我计划稍后再做):

来自php:5.6-apache
运行/contracts/provision/web.sh
但是我一直得到一个错误,web.sh找不到。在我的Dockerfile中放入各种
ls
命令等,表明没有在容器上创建名为“contracts”的目录。如果我直接使用一个现有的目录,比如
mnt
,我会得到相同的结果-目录仍然是空的

但是,docker inspect
显示它显然已安装

“挂载”:[
{
“类型”:“绑定”,
“来源”:“/流浪者”,
“目的地”:“/合同”,
“模式”:“rw”,
“RW”:没错,
“传播”:”
}
],
我在运行Ubuntu14.04的流浪者盒子上运行docker compose


任何帮助都将不胜感激,我已筋疲力尽。谢谢

卷附加到容器,容器通过图像创建,图像通过build命令创建。当您运行构建时,卷装载将不存在,因此在
RUN
命令期间您将看不到它

在构建时,您将
复制
添加
此目录到映像中,而不是装载卷。在执行
RUN
命令之前,您可以在Dockerfile中包含类似的内容:

COPY . /contracts
请注意,如果执行此操作并在运行时将卷装载到同一位置,则将隐藏映像中该位置存在的任何内容。因此,请将需要成为映像一部分的命令和脚本与需要成为持久卷一部分的数据分开,并且只将构建时脚本复制到映像中

使用正在运行的容器,您可以尝试使用
docker exec-it$container\u id ls/contracts
查看它是否如预期的那样存在


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

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

在构建时,您将
复制
添加
此目录到映像中,而不是装载卷。在执行
RUN
命令之前,您可以在Dockerfile中包含类似的内容:

COPY . /contracts
请注意,如果执行此操作并在运行时将卷装载到同一位置,则将隐藏映像中该位置存在的任何内容。因此,请将需要成为映像一部分的命令和脚本与需要成为持久卷一部分的数据分开,并且只将构建时脚本复制到映像中

使用正在运行的容器,您可以尝试使用
docker exec-it$container\u id ls/contracts
查看它是否如预期的那样存在


如果目录存在但为空,最可能的原因是您在VM或远程主机上有docker,并且您正在其他环境中运行命令。文件夹需要存在于docker主机(VM)上才能装入容器。Docker for Win和Docker for Mac具有将特定文件夹或驱动器共享到VM的设置,如果您在不同于预期的位置进行构建,则可能需要调整这些设置。注意linux文件名的大小写敏感性。

感谢您的回复。我能够像这样得到我的供应脚本。但是,在我按照您的建议尝试了
docker exec-it$container\u id ls/contracts
之后,它仍然没有挂载(只有“provision”目录存在于该位置)。我现在是在没有流浪汉的情况下,在本地尝试。有什么想法吗?谢谢你的回复。我能够像这样得到我的供应脚本。但是,在我按照您的建议尝试了
docker exec-it$container\u id ls/contracts
之后,它仍然没有挂载(只有“provision”目录存在于该位置)。我现在是在没有流浪汉的情况下,在本地尝试。有什么想法吗?