Ubuntu Docker Compose volume不';t在子文件夹中持久化文件

Ubuntu Docker Compose volume不';t在子文件夹中持久化文件,ubuntu,docker,docker-compose,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

我有以下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
,并启动所有需要的容器。但让我困惑的是卷文件夹有两个空文件夹:
configdb
db
,但里面没有数据文件。当我移除db容器时,预期会导致数据丢失

我已尝试连接到db容器并在
/data
文件夹和
/data/db
文件夹中手动创建文件,并且只有在
/data
文件夹中创建的文件出现在主机卷文件夹中。docker似乎只能在“卷设置”中指定的文件夹中创建文件或文件夹,但无法在子文件夹中创建文件。我可能错了。要为我需要持久化的每个文件夹创建卷是很困难的。有没有办法为我的案例正确配置卷

环境: 说明:Ubuntu 14.04.3 LTS 发行日期:14.04 代号:trusty

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

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

Docker编写版本 docker compose版本1.7.1,内部版本0a9ab35 docker py版本:1.8.1 CPython版本:2.7.9
OpenSSL版本:OpenSSL 1.0.1e 2013年2月11日

您创建的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/\u data,因此它似乎与主机有连接,但docker只是将数据保存在主机上的特殊位置/var/lib/docker是docker的内部目录。这不是docker术语中的主机卷。但无论如何,即使在删除使用该命名卷的docker容器后,它也会使文件持久化,对吗?是的,命名卷是持久化的,我发布了一个示例,显示它们甚至可以与子目录一起工作。