【问题标题】:Docker Compose volume doesn't persist files in subfoldersDocker Compose 卷不会将文件保留在子文件夹中
【发布时间】:2016-10-08 14:24:02
【问题描述】:

我有以下 docker-compose.yml

version: '2'

services:
  web:
    image: user-service-web:${WEB_IMAGE_VER}
    depends_on:
      - db
    environment:
      NODE_ENV: ${NODE_ENV}
    networks:
      user-service:
        aliases:
          - user-service-web
    ports:
      - "80:3000"
    restart: always
  db:
    image: user-service-mongodb:latest
    networks:
      viewster-user-service:
        aliases:
          - user-service-mongodb
    ports:
      - "27017:27017"
    restart: always
    volumes:
      - mongodb:/data/
networks:
  user-service:
    driver: bridge
volumes:
  mongodb:

当我运行docker-compose up 时,它会创建指定的卷mongodb 并启动所有必需的容器。但令我困惑的是,卷文件夹有 2 个空文件夹:configdbdb,但里面没有数据文件。当我删除数据库容器时,它预计会导致数据丢失。

我尝试连接到数据库容器并在/data 文件夹和/data/db 文件夹中手动创建文件,并且只有在/data 文件夹中创建的文件出现在主机卷文件夹中。似乎 docker 只能在您在卷设置中指定的文件夹中创建文件或文件夹,但不能在子文件夹中创建文件。我可能是错的。为我需要持久化的每个文件夹创建卷会很棘手。有什么方法可以为我的情况正确配置音量?

环境: 说明:Ubuntu 14.04.3 LTS 发布:14.04 代号:信任

Docker 版本: 客户: 版本:1.11.2 API版本:1.23 围棋版本:go1.5.4 Git 提交:b9f10c9 建成:2016 年 6 月 1 日星期三 21:47:50 操作系统/架构:linux/amd64

服务器: 版本:1.11.2 API版本:1.23 围棋版本:go1.5.4 Git 提交:b9f10c9 建成:2016 年 6 月 1 日星期三 21:47:50 操作系统/架构:linux/amd64

Docker Compose 版本 docker-compose 版本 1.7.1,构建 0a9ab35 docker-py 版本:1.8.1 CPython 版本:2.7.9 OpenSSL 版本:OpenSSL 1.0.1e 2013 年 2 月 11 日

【问题讨论】:

    标签: ubuntu docker docker-compose


    【解决方案1】:

    您创建的 mongodb 是命名卷,而不是主机卷,因此它与主机文件没有连接。命名卷将存在于 docker 内部目录中。当使用带有容器的空卷时,它将在该位置接收映像卷内容的副本。如果您运行docker-compose down -v,它也会被删除。

    如果你想要一个主机卷,你需要在你的 db 服务下改为这一行:

    volumes:
      - ./data:/data
    

    这将在您运行 docker-compose up 命令的文件夹内使用/创建一个数据文件夹,该文件夹是安装在容器中 /data 的主机卷。

    更新:

    作为命名卷持久化数据的证据,这里有一个简单的例子:

    bash$ cat docker-compose.yml 
    version: '2'
    
    volumes:
      testvol:
        driver: local
    
    services:
      testapp:
        image: busybox
        entrypoint: "top"
        volumes:
          - testvol:/data
    
    bash$ ../bin/docker-compose up -d
    Creating network "test_default" with the default driver
    Creating volume "test_testvol" with local driver
    Creating test_testapp_1
    bash$ ../bin/docker-compose exec testapp /bin/sh
    / # find /data
    /data
    / # mkdir /data/sub
    / # touch /data/a
    / # touch /data/sub/b
    / # find /data
    /data
    /data/sub
    /data/sub/b
    /data/a
    / # exit
    bash$ ../bin/docker-compose down
    Stopping test_testapp_1 ... done
    Removing test_testapp_1 ... done
    Removing network test_default
    bash$ ../bin/docker-compose up -d
    Creating network "test_default" with the default driver
    Creating test_testapp_1
    bash$ ../bin/docker-compose exec testapp /bin/sh
    / # find /data
    /data
    /data/sub
    /data/sub/b
    /data/a
    / # exit
    

    【讨论】:

    • 创建命名卷让我可以访问主机上的文件 /var/lib/docker/volumes//_data 所以似乎它与主机有连接,但 docker 只是将数据保存在主机上的特殊位置
    • /var/lib/docker 是 docker 内部目录。这不是 docker 术语中的主机卷。
    • 但无论如何,即使在删除使用该命名卷的 docker 容器之后,它也会使文件持久化,对吧?
    • 是的,命名卷是持久的,我发布了一个示例,表明它们甚至可以使用子目录。
    猜你喜欢
    • 2020-04-06
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2020-07-15
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多