Docker-Compose persistent data MySQL

后端 未结 5 1630
温柔的废话
温柔的废话 2020-11-28 01:31

I can\'t seem to get MySQL data to persist if I run $ docker-compose down with the following .yml

version: \'2\'
services:
  # othe         


        
相关标签:
5条回答
  • 2020-11-28 01:44

    Actually this is the path and you should mention a valid path for this to work. If your data directory is in current directory then instead of my-data you should mention ./my-data, otherwise it will give you that error in mysql and mariadb also.

    volumes:
     ./my-data:/var/lib/mysql
    
    0 讨论(0)
  • 2020-11-28 01:46

    The data container is a superfluous workaround. Data-volumes would do the trick for you. Alter your docker-compose.yml to:

    version: '2'
    services:
      mysql:
        container_name: flask_mysql
        restart: always
        image: mysql:latest
        environment:
          MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this
          MYSQL_USER: 'test'
          MYSQL_PASS: 'pass'
        volumes:
          - my-datavolume:/var/lib/mysql
    volumes:
      my-datavolume:
    

    Docker will create the volume for you in the /var/lib/docker/volumes folder. This volume persist as long as you are not typing docker-compose down -v

    0 讨论(0)
  • 2020-11-28 01:46

    You have to create a separate volume for mysql data.

    So it will look like this:

    volumes_from:
      - data
    volumes:
      - ./mysql-data:/var/lib/mysql
    

    And no, /var/lib/mysql is a path inside your mysql container and has nothing to do with a path on your host machine. Your host machine may even have no mysql at all. So the goal is to persist an internal folder from a mysql container.

    0 讨论(0)
  • 2020-11-28 01:52

    There are 3 ways:

    First way

    You need specify the directory to store mysql data on your host machine. You can then remove the data container. Your mysql data will be saved on you local filesystem.

    Mysql container definition must look like this:

    mysql:
      container_name: flask_mysql
      restart: always
      image: mysql:latest
      environment:
        MYSQL_ROOT_PASSWORD: 'test_pass' # TODO: Change this
        MYSQL_USER: 'test'
        MYSQL_PASS: 'pass'
    volumes:
     - /opt/mysql_data:/var/lib/mysql
    ports:
      - "3306:3306"
    

    Second way

    Would be to commit the data container before typing docker-compose down:

    docker commit my_data_container
    docker-compose down
    

    Third way

    Also you can use docker-compose stop instead of docker-compose down (then you don't need to commit the container)

    0 讨论(0)
  • 2020-11-28 01:57

    Adding on to the answer from @Ohmen, you could also add an external flag to create the data volume outside of docker compose. This way docker compose would not attempt to create it. Also you wouldn't have to worry about losing the data inside the data-volume in the event of $ docker-compose down -v. The below example is from the official page.

    version: "3.8"
    
    services:
      db:
        image: postgres
        volumes:
          - data:/var/lib/postgresql/data
    
    volumes:
      data:
        external: true
    
    0 讨论(0)
提交回复
热议问题