Docker Compose卷不会保留子文件夹

时间:2016-06-08 10:50:46

标签: ubuntu docker docker-compose

我有以下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并启动所有必需的容器。但令我困惑的是,volume文件夹有2个空文件夹:configdbdb,但里面没有数据文件。当我删除db容器时,它预计会导致数据丢失。

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

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

Docker版本: 客户:  版本:1.11.2  API版本:1.23  转到版本:go1.5.4  Git commit:b9f10c9  建造:2016年6月1日星期三21:47:50  OS / Arch:linux / amd64

服务器:  版本:1.11.2  API版本:1.23  转到版本:go1.5.4  Git commit:b9f10c9  建造:2016年6月1日星期三21:47:50  OS / Arch:linux / amd64

Docker撰写版本 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 :(得分:0)

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

如果您需要主机卷,则需要在数据库服务下更改为此行:

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