Docker / Docker-撰写卷填充和共享问题

时间:2019-01-08 15:33:21

标签: docker docker-compose dockerfile docker-volume

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

所以这是我要实现的目标的想法:

enter image description here

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

docker-compose.yml:

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

php.dockerfile:

FROM php:7-fpm
VOLUME project
根据我的理解,

在运行docker-compose时,我们应该在主机上创建一个包含来自容器中/ project中所有文件的卷。并且来自容器的/ project应该包含来自host的./host-project-directory中的所有文件。 如果我将/ project的内容放在容器中,则可以从主机上看到文件,但是使用 docker卷列表,主机上没有创建任何卷,为什么?

问题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”的卷,并将其绑定到两个容器 php web 上的/ project目录。 现在,如何用./host-project-directory中的内容填充此卷? 我尝试添加类似

的dockerfile
ADD ./host-project-directory /project

但没有任何变化,音量保持为空。

很抱歉,这是由于我缺乏使用Docker的经验,但是我不知道如何使这个简单的事情起作用。

谢谢您的时间!

2 个答案:

答案 0 :(得分:3)

对于第一个问题,我尝试一个简单的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卷列表,我可以看到使用本地驱动程序创建的卷。使ls进入文件夹,我也可以看到该文件。需要注意的重要一点是,本地目录中存在的文件与容器中的文件不同。因此,如果您在主机中编辑文件,则不会更改容器中的文件。那是因为您在另一个路径中创建了卷,可能在以下位置:/ var / lib / docker / volumes / ... 发生这种情况是因为您将卷映射到路径,但未指定要在何处卷。为此,只需使您的docker-compose像这样:

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

这样做,我仍然可以通过volume list命令看到卷,但是没有名称。 所以我不知道为什么您看不到列表中的音量。

问题2:

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

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

答案 1 :(得分:2)

A bind mount is not the same thing as a volume。您在此处定义命名卷,但需要绑定安装的功能。

尝试一下

version: '3'
services:
    php:
        build:
            context: .
            dockerfile: php.dockerfile
        volumes:
            - ./host-project-directory:/project
    web:
        image: nginx
        links:
            - php
        volumes:
            - ./host-project-directory:/project
相关问题