繁体   English   中英

Docker - 安装不像常规安装的卷

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM