[英]Docker — mounting a volume not behaving like regular mount
我是docker
新手所以我确信我做错了什么。 我not a php developer
但在这种情况下这应该不重要。
我正在使用drupal
docker镜像,它在/var/www/html
目录中有数据。
我试图从主机系统上的本地目录中使用drupal站点覆盖此数据。
根据文档,这是预期的行为
将主机目录挂载为数据卷
除了使用-v标志创建卷之外,您还可以将Docker引擎主机中的目录安装到容器中。
$ docker run -d -P --name web -v / src / webapp:/ webapp training / webapp python app.py
此命令将主机目录/ src / webapp安装到/ webapp的容器中。 如果路径/ webapp已经存在于容器的映像中,则/ src / webapp挂载覆盖但不会删除预先存在的内容。 删除安装后,可以再次访问该内容。 这与mount命令的预期行为一致。
但是我发现容器上不存在本地drupal站点文件。 我的完整工作流程如下:
docker-compose.yml
drupal:
container_name: empower_drupal
build: ./build/drupal-local-codebase
ports:
- "8888:80"
- "8022:22"
- "443"
#volumes: THIS IS ALSO NOT WORKING
#- /home/sameh/empower-tap:/var/www/html
$ docker-compose up -d
# edit the container by snapshotting it
$ docker commit empower_drupal empower_drupal1
$ docker run -d -P --name empower_drupal2 -v /home/sameh/empower-tap:/var/ww/html empower_drupal1
# snapshot the container to examine it
$ docker commit 9cfeca48efd3 empower_drupal2
$ docker run -t -i empower_drupal2 /bin/bash
empower_drupal2容器没有来自/home/sameh/empower-tap
目录的正确文件。
这是你做的,带有一些注释。
$ docker-compose up -d
鉴于你的搬运工,compose.yml,与volumes
注释掉,在这一点上,你已经运行的容器部分,但没有安装卷。
# edit the container by snapshotting it
$ docker commit empower_drupal empower_drupal1
你在这里所做的一切都是你已经拥有的图像的副本,除非你的容器在启动时对自己做了改动。
$ docker run -d -P --name empower_drupal2 -v /home/sameh/empower-tap:/var/ww/html empower_drupal1
在这里,您已运行新副本,已安装卷。 好的,这个文件现在可以在这个容器中使用了。
# snapshot the container to examine it
$ docker commit 9cfeca48efd3 empower_drupal2
我在这里假设你想将卷的内容提交到图像中。 那不管用。 提交文档清楚地说明了这一点:
提交操作将不包括容器内安装的卷中包含的任何数据。
$ docker run -t -i empower_drupal2 /bin/bash
因此,正如您所发现的,当您运行commit
生成的图像但没有卷安装时,文件就不存在了。
此外,您的docker-compose.yml示例中还不清楚volume volumes:
section是否在注释掉之前。 目前它似乎在左边缘,这是行不通的。 它需要与build:
和ports:
处于同一级别ports:
为了处理你的drupal
服务。
这取决于你的目标。
如果您只是想用本地系统中的文件填充图像,可以在Dockerfile中执行此操作。
COPY local-dir/* /var/www/html
您提到此副本无法工作,因为该目录不是本地的。 不幸的是,用symlink这样的东西很难解决。 您最好的选择是在构建之前将目录复制到本地上下文。 Docker 不打算改变这种行为 。
一种常见的情况是您希望使用本地目录进行开发,以便立即反映更改而不是进行重建。 但是当不进行开发时,您希望将文件烘焙到图像中。
在这种情况下,首先告诉Dockerfile将文件复制到图像中,如上所述。 这样,图像构建将包含它们,卷装载或否。
然后,在进行开发时,使用volumes:
在docker-compose.yml中,或者使用-v
标志到docker run,以安装卷。 卷装置将覆盖图像中的任何内容,因此您将使用本地文件。 当您完成并且代码已准备就绪时,只需执行映像构建,您的最终文件将被烘焙到映像中以进行部署。
您也可以通过安装卷,将内容复制到其他地方,然后提交结果,以略微迂回的方式执行此操作。
# start a container with the volume mounted somewhere
docker run -d -v /home/sameh/empower-tap:/var/www/html_temp [...etc...]
# copy the files elsewhere inside the container
docker exec <container-name> cp -r /var/www/html_temp /var/www/html
# commit the result
docker commit empower_drupal empower_drupal1
然后,您应该在生成的图像中包含已安装的卷文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.