docker-compose: no declaration was found in the volumes section

Viewed 1014

Im trying to use Docker-Compose on Microsoft Windows to create a stack for Seafile.

The error message after creating is:

Deployment error failed to deploy a stack: Named volume “C:/Users/Administrator/Docker/Volumes/Seafile/Mysql:/var/lib/mysql:rw” is used in service “db” but no declaration was found in the volumes section. : exit status 1

Here's my problematic docker-compose.yaml file :

version: '2'
services:
  db:
    image: mariadb:10.5
    container_name: seafile-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=db_dev  # Requested, set the root's password of MySQL service.
      - MYSQL_LOG_CONSOLE=true
    volumes:
      - C:/Users/Administrator/Docker/Volumes/Seafile/Mysql:/var/lib/mysql  # Requested, specifies the path to MySQL data persistent store.
    networks:
      - seafile-net

  memcached:
    image: memcached:1.5.6
    container_name: seafile-memcached
    entrypoint: memcached -m 256
    networks:
      - seafile-net
          
  seafile:
    image: seafileltd/seafile-mc:latest
    container_name: seafile
    ports:
      - "9000:80"
#     - "443:443"  # If https is enabled, cancel the comment.
    volumes:
      - C:/Users/Administrator/Docker/Volumes/Seafile/Seafile:/shared   # Requested, specifies the path to Seafile data persistent store.
    environment:
      - DB_HOST=db
      - DB_ROOT_PASSWD=db_dev  # Requested, the value shuold be root's password of MySQL service.
      - TIME_ZONE=Etc/UTC  # Optional, default is UTC. Should be uncomment and set to your local time zone.
      - SEAFILE_ADMIN_EMAIL=me@example.com  # Specifies Seafile admin user, default is 'me@example.com'.
      - SEAFILE_ADMIN_PASSWORD=asecret     # Specifies Seafile admin password, default is 'asecret'.
      - SEAFILE_SERVER_LETSENCRYPT=false   # Whether to use https or not.
      - SEAFILE_SERVER_HOSTNAME=docs.seafile.com # Specifies your host name if https is enabled.
    depends_on:
      - db
      - memcached
    networks:
      - seafile-net

networks:
  seafile-net:
1 Answers

If you use volumes: under services: you also need to declare these volumes into the dedicated root section (called volumes: as well).

Example with 2 volumes:

...
services:
    ...
    volumes:
      - a:/path1
      - b:/path2
    ...
volumes:
  a:
  b:
...

The declaration you can see at the bottom is used to create the volumes, while the entries in the service: block just use them. That's why you see "no declaration was found in the volumes section". You need to declaring them into the correct declaration section in the root position (that is different from the usage section under services:).

I know that this could be somehow scattered and I know Docker could handle it differently in another universe, but at the current version it does it in this way.

Let me know if this was your problem.

More info:

https://docs.docker.com/storage/volumes/#use-a-volume-with-docker-compose

Related