java12399900
java12399900

Reputation: 1681

docker: create a mongodb volume that is still saved after docker-compose down?

I have the following docker-compose.yml file:

version: "3"

services:
  pokerstats:
    image: pokerstats
    container_name: pokerstats
    ports:
      - 8080:8080
    depends_on: 
      - db
  db:
    image: mongo
    container_name: mongo
    volumes:
      - ./database:/data
    ports:
      - "27018:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: admin
      MONGO_INITDB_DATABASE: pokerstats

My issue is that when I run docker-compose down all the data within my mongo database is lost.

How can I create a mongo volume that persists even when the mongo container goes down?

Upvotes: 2

Views: 5950

Answers (2)

BMitch
BMitch

Reputation: 265228

Per the image documentation the database volume needs to be /data/db. This is also seen in the Dockerfile volume.

Since the volume is defined in the Dockerfile, if you do not create a volume at that directory, even if you created a volume in the parent like /data, docker will create an anonymous volume at /data/db which will show up as a long guid volume name in docker volume ls. Depending on how the container is run, those may be left behind.

Therefore the fix is to adjust your volume mount to that path:

version: "3"

services:

  pokerstats:
    image: pokerstats
    container_name: pokerstats
    ports:
      - 8080:8080
    depends_on: 
      - db

  db:
    image: mongo
    container_name: mongo
    volumes:
      - ./database:/data/db
    ports:
      - "27018:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: admin
      MONGO_INITDB_DATABASE: pokerstats

Note that unless you need direct access to this data on the host, I'd recommend using a named volume instead. It includes initialization steps that helps with permission issues you may encounter with host volumes, particularly when running directly on a Linux host.


To use a named volume, that would look like:

version: "3"
    
services:

  pokerstats:
    image: pokerstats
    container_name: pokerstats
    ports:
      - 8080:8080
    depends_on: 
      - db

  db:
    image: mongo
    container_name: mongo
    volumes:
      - dbdata:/data/db
    ports:
      - "27018:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: admin
      MONGO_INITDB_DATABASE: pokerstats
volumes:
    dbdata:

Upvotes: 6

Valijon
Valijon

Reputation: 13113

Try to change volumes for MongoDb container:

volumes:
  - "./database:/data/db"

Upvotes: 0

Related Questions