Docker – 安装一个不像常规安装的卷

我是新来的docker所以我确定我做错了什么。 我not a php developer但这不应该在这种情况下。

我正在使用/var/www/html目录下的数据的drupal docker镜像。

我试图用主机系统上的本地目录中的drupal站点覆盖这些数据。

根据文件,这是预期的行为

将主机目录挂载为数据卷

除了使用-v标志创build卷之外,还可以将Docker引擎主机的目录挂载到容器中。

$ docker run -d -P –name web -v / src / webapp:/ webapp training / webapp python app.py

该命令将主机目录/ src / webapp安装到/ webapp的容器中。 如果path/ web应用程序已经存在于容器的映像中,那么/ src / webapp挂载会覆盖,但不会删除预先存在的内容。 一旦挂载被删除,内容可以再次访问。 这与mount命令的预期行为一致。

但是,我发现本地drupal站点文件不存在于容器上。 我的完整工作stream程如下:

 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 

鉴于您的docker-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:部分在被注释掉之前还不清楚。 目前它似乎在左边缘,这是行不通的。 它需要与build:ports:为了在你的drupal服务上工作。

该怎么做

这取决于你的目标。

只需从本地复制文件

如果你真的只想用来自本地系统的文件填充图像,你可以在Dockerfile中做到这一点。

 COPY local-dir/* /var/www/html 

你提到这个副本不能工作,因为这个目录不是本地的。 不幸的是,像一个符号链接不能轻易解决。 你最好的select是在构build之前将目录复制到本地上下文中。 Docker 不打算改变这种行为 。

覆盖开发的内容

一个常见的情况是您想使用本地目录进行开发,以便更改立即反映出来,而不是重build。 但是,如果不进行开发,你想要的文件烘焙到图像。

在这种情况下,首先告诉Dockerfile将文件复制到映像中,如上所述。 这样一个图像生成将包含他们,卷装或不。

然后,在进行开发时,使用volume volumes:在docker-compose.yml中,或使用-v标志到docker run来装入卷。 卷挂载将覆盖所有映射到映像中的内容,因此您将使用本地文件。 当你完成了代码准备就绪后,只需要进行一次图像构build,最终的文件就会被映射到图像中进行部署。

使用音量加一个提交

您也可以通过安装音量,在其他地方复制内容,然后提交结果,以稍微迂回的方式做到这一点。

 # 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 

然后,你应该有你的挂载卷文件在生成的图像。