首页 > 解决方案 > Docker / Docker-compose 卷填充和共享问题

问题描述

我有几个关于 Docker 卷的问题。我已经在运行 debian 的新主机上安装了 Docker 和 docker-compose。我设法为一个简单的 nginx/php-fpm 项目运行了一个 docker-compose 文件,这两个容器都安装在包含源代码的目录上。我想尝试创建一个可以在我的容器之间共享的单个卷,但是我遇到了一些问题,而且我对官方文档的理解没有帮助。

所以这是我想要实现的一个想法:

在此处输入图像描述

问题 1:尝试从主机挂载的目录上的 dockerfile 创建卷

码头工人-compose.yml :

version: '3'
services:
    php:
        build:
            context: .
            dockerfile: php.dockerfile
        volumes:
            - ./host-project-directory:/project

php.docker 文件:

FROM php:7-fpm
VOLUME project

据我了解,在运行 docker-compose 时,我们应该在主机上创建一个卷,其中包含容器中 /project 中的所有文件。容器中的 /project 应该包含来自主机的 ./host-project-directory 中的所有文件。如果我 ls 容器上 /project 的内容,我可以从主机中看到文件,但是使用docker volume list,主机上没有创建卷,为什么?

问题 2:如何从另一个容器填充和使用此卷?

version: '3'
services:
    php:
        build:
            context: .
            dockerfile: php.dockerfile
        volumes:
            - named-volume:/project
    web:
        image: nginx
        links:
            - php
        volumes:
            - named-volume:/project
volumes:
    named-volume:

这应该创建一个名为“named-volume”的卷并将其绑定到容器phpweb上的 /project 目录。 现在,如何使用 ./host-project-directory 中的内容填充此卷? 我试过添加一个像

ADD ./host-project-directory /project

但什么都没有改变,卷仍然是空的。

如果这是因为我缺乏使用 Docker 的经验,我很抱歉,但我不知道如何让这个简单的事情发挥作用。

感谢您的时间 !

标签: dockerdocker-composedockerfiledocker-volume

解决方案


对于第一个问题,我尝试了一个简单的 docker 文件,如下所示:

FROM php:7-fpm
COPY ./project /project

还有一个像这样的 docker-compose:

version: '3'
services:
    php:
        build: .
        volumes:
            - named-volume:/project
    web:
        image: nginx
        links:
            - php
        volumes:
            - named-volume:/project
volumes:
    named-volume:

由于您在 docker-compose 上创建了卷,因此无需在 Dockerfile 中创建该卷。运行 docker volume list,我可以看到使用本地驱动程序创建的卷。在文件夹中制作 ls 我也可以看到该文件。需要注意的是,本地目录中的文件与容器内的文件不同。因此,如果您编辑主机中的文件,这不会更改容器中的文件。那是因为您在另一个路径中创建了卷,可能位于:/var/lib/docker/volumes/... 这是因为您将卷映射到路径,但没有指定卷的位置。要做到这一点,只需让你的 docker-compose 像这样:

version: '3'
services:
    php:
        build: .
        volumes:
            - ./project:/project
    web:
        image: nginx
        links:
            - php
        volumes:
            - ./project:/project

这样做我仍然可以使用卷列表命令查看卷,但没有名称。所以我不知道你为什么看不到列表中的音量。

对于问题 2:

执行上面的示例,我在本地“项目”文件夹中存在容器内的文件。

请检查本地文件夹的路径是否正确。


推荐阅读