如何使用 docker compose 创建外部卷?

How do I create an external volume using docker compose?

基于这个 Node-RED tutorial,我正在尝试在 docker 机器之外安装一个带有 Node-RED 文件的外部卷。我正在使用以下 docker-compose 文件:

version: "3.7"

services:
  node-red:
    image: nodered/node-red:latest
    environment:
      - TZ=Europe/Amsterdam
    ports:
      - "2000:1880"
    networks:
      - node-red-net
    volumes:
      - node-red-data:/home/user/node-red1
    
volumes:
  node-red-data:
    
networks:
  node-red-net:

然而,尽管这个文件在我 运行 docker-compose up 时工作正常,但该卷只存在于 docker 机器中。我尝试在 volumes 中添加 external: true 行,但出现以下错误:

ERROR: In file './docker-compose.yml', volume 'external' must be a mapping not a boolean. 

我错过了什么?如何使用 docker-compose 文件挂载外部卷?

我最终找到了一个与 this answer 相关的问题。那里有多个答案对我不起作用(也没有公认的答案)。有效的语法是:

  node-red-data:
    driver: local
    driver_opts:
      o: bind
      type: none
      device: /path/external/folder

所以在 运行 docker-compose up 之后有效的最终 dockerfile 是:

version: "3.7"

services:
  node-red:
    image: nodered/node-red:latest
    environment:
      - TZ=Europe/Amsterdam
    ports:
      - "2000:1880"
    networks:
      - node-red-net
    volumes:
      - node-red-data:/data
    container_name: node-red

volumes:
  node-red-data:
    driver: local
    driver_opts:
      o: bind
      type: none
      device: "/home/user/node-red1"
networks:
  node-red-net:

更新

如果我们不介意为卷取一个随机名称,以下解决方案也可以正常工作:

version: "3.7"

services:
  node-red:
    image: nodered/node-red:latest
    environment:
      - TZ=Europe/Amsterdam
    ports:
      - "2000:1880"
    volumes:
      - /home/user/node-red1:/data
    container_name: node-red