首页 文章

Docker Compose卷不会保留子文件夹中的文件

提问于
浏览
3

我有以下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 ,但里面没有数据文件 . 当我删除db容器时,它预计会导致数据丢失 .

我已经尝试连接到db容器并在 /data 文件夹和 /data/db 文件夹中手动创建文件,并且只有在 /data 文件夹中创建的文件出现在主机卷文件夹中 . 似乎docker只能在您在子文件夹中创建文件的文件夹中创建文件或文件夹 . 我错了 . 为每个需要持久化的文件夹创建卷会很棘手 . 有没有办法为我的情况正确配置音量?

环境:描述:Ubuntu 14.04.3 LTS版本:14.04代号:可信赖

Docker版本:客户端:版本:1.11.2 API版本:1.23 Go版本:go1.5.4 Git commit:b9f10c9内置:Wed Jun 1 21:47:50 2016 OS / Arch:linux / amd64

服务器:版本:1.11.2 API版本:1.23 Go版本:go1.5.4 Git commit:b9f10c9内置:Wed Jun 1 21:47:50 2016 OS / Arch:linux / amd64

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

1 回答

  • 0

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

    如果需要主机卷,则需要在db服务下更改为此行:

    volumes:
      - ./data:/data
    

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

    Update:

    作为命名容器持久化数据的证据,这是一个简单的例子:

    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
    

相关问题