【问题标题】:docker-compose volume is empty even from initialize即使从初始化,docker-compose 卷也是空的
【发布时间】:2017-02-22 15:31:11
【问题描述】:

我尝试为不同的网站创建一个 docker-compose 图像。

一切正常,除了我的卷。

这里是docker-compose.yml的一个例子:

version: '2'

services:
  website:
    build: 
        context: ./dockerfiles/                                        
        args:                                                                      
            MYSQL_ROOT_PASSWORD: mysqlp@ssword 
    volumes:
        - ./logs:/var/log
        - ./html:/var/www
        - ./nginx:/etc/nginx
        - ./mysql-data:/var/lib/mysql
    ports:
        - "8082:80"
        - "3307:3306"

这里是我的Dockerfile:

FROM php:5.6-fpm

ARG MYSQL_ROOT_PASSWORD

RUN export DEBIAN_FRONTEND=noninteractive; \
echo mysql-server mysql-server/root_password password $MYSQL_ROOT_PASSWORD | debconf-set-selections; \
echo mysql-server mysql-server/root_password_again  password $MYSQL_ROOT_PASSWORD | debconf-set-selections;

RUN apt-get update && apt-get install -y -q mysql-server php5-mysql nginx wget

EXPOSE 80 3306

VOLUME ["/var/www", "/etc/nginx", "/var/lib/mysql", "/var/log"]

一切正常,预计我的所有文件夹在我的主机卷中都是空的。我想在我的文件夹中查看 nginx conf 和 mysql 数据。

我做错了什么?

编辑 1: 实际上,问题是我希望 docker-compose 在我的 docker 目录中创建该卷(如果它不存在),并使用该卷(如果存在),正如 https://stackoverflow.com/a/39181484 中所解释的那样。但这似乎不起作用。

【问题讨论】:

标签: docker docker-compose dockerfile


【解决方案1】:

问题在于您希望将容器中的文件挂载到您的主机上

这不是它的工作方式:它是相反的方式:

Docker 将您的主机文件夹安装在您指定的容器文件夹中。 如果你进入容器,你会看到应该有初始化文件的地方,什么都没有(或者你的主机文件夹中的任何东西),你可以在文件夹中写一个文件,它会出现在您的主机上。

获取初始化文件并为您的容器修改它们的最佳选择是:

  • 在不挂载文件夹的情况下创建容器(原始容器数据会在那里)
  • 运行容器(容器将从安装nginx等文件到正确的位置...)docker run <image>
  • 使用docker cp <container>:<container_folder>/* <host_folder>将文件复制出容器
  • 现在您在主机上拥有来自容器 init 的“原始”文件。
  • 根据容器的需要修改文件。
  • 运行容器,装载您的主机文件夹,其中包含新文件。

注意事项: 你可能想用 shell (docker run -it <image> /bin/sh) 进入容器并压缩所有文件夹以确保如果有嵌套文件夹,你得到了所有东西,然后docker cp ... 压缩文件

另外,请注意文件系统是否区分大小写:在 linux 上,文件区分大小写。在 Mac OS X 上,它们不是。所以如果Init.confinit.conf 在同一个文件夹中,当你将它们复制到Mac OS X 主机时它们会发生冲突。

【讨论】:

  • 感谢您的回答。我看到的是,如果我将一个卷安装到容器中而不在 docker-compose 中指定任何内容,则每个卷的内容在主机中可见到“/var/lib/docker/volumes/.../_data”中,仅当该卷以前不存在。我的理解是,如果我为我的卷指定另一个路径进入主机(就像我在 docker-compose 中所做的那样),行为会有所不同,即使该文件夹之前不存在?
  • 你不应该弄乱 /var/lib/docker/volumes... 因为那是 Docker 的内部。 Docker 将根据需要创建/删除这些文件夹,所以不要依赖它。 Docker 使用分层文件系统,因此如果卷被多次定义,它会重用它们。同样,不要依赖 Docker 的内部文件来完成工作:将主机文件夹挂载到容器上它所属的位置,然后只期望其中的内容显示在容器上。如果您在容器文件夹中有文件,如果您不挂载主机文件夹,它们将在那里。
  • 如果您需要这两组文件,那么您应该有一个 ENTRYPOINT 来运行脚本并决定加载哪个。然后,您可以在需要的地方模拟链接正确的文件夹/文件。
  • 这是一个很好的答案,它详细解释了容器如何安装在主机上。
  • 但是为什么 docker mongo 像 ~/data/db:/data/db 一样工作,容器的 /data/db 不会是空的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
相关资源
最近更新 更多