【问题标题】:Detaching volumes (for a fresh restart) when shutting down Docker关闭 Docker 时分离卷(用于重新启动)
【发布时间】:2021-04-02 18:54:10
【问题描述】:

我有一个创建 MySQL 8.0 容器的 Docker Compose(文件名为 my-main-db.yml):

version: "3.7"
services:
  my-main-db:
    env_file:
      - .env
    image: mysql:8
    container_name: my-main-db
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: $MY_SERVICE_DB_ROOT_PASSWORD
      MYSQL_DATABASE: my_service_db_local
      MYSQL_USER: $MY_SERVICE_DB_APP_USER
      MYSQL_PASSWORD: $MY_SERVICE_DB_APP_PASSWORD
    volumes:
      - ./my-service-db-data:/var/lib/mysql

要启动它,我运行:

docker-compose -f my-main-db.yml up

它运行得很好,我可以连接到它,也可以通过docker ps看到它运行。

如果我想停止此容器并保留其中的所有数据,我将其关闭:

docker-compose -f my-main-db.yml down

但如果我想停止这个容器并擦除其中的所有数据,以便它以全新的方式启动(并且干净),我的理解是我需要分离或删除体积。所以我一直试图像这样关闭它:

docker-compose -f my-main-db.yml down -v

但是,当我这样做并重新启动它时,我的数据仍然存在,而我希望有一个全新的(空)数据库。

谁能看出我哪里出错了?

【问题讨论】:

    标签: docker docker-compose docker-volume


    【解决方案1】:

    docker-compose down -v 将删除命名卷,但它不会删除您作为绑定挂载(如在您的配置中)挂载的目录。为此,您需要自己使用rm -rf

    如果您希望docker-compose 管理卷,请改用命名卷:

    version: "3.7"
    services:
      my-main-db:
        env_file:
          - .env
        image: mysql:8
        container_name: my-main-db
        command: --default-authentication-plugin=mysql_native_password
        restart: always
        ports:
          - 3306:3306
        environment:
          MYSQL_ROOT_PASSWORD: $MY_SERVICE_DB_ROOT_PASSWORD
          MYSQL_DATABASE: my_service_db_local
          MYSQL_USER: $MY_SERVICE_DB_APP_USER
          MYSQL_PASSWORD: $MY_SERVICE_DB_APP_PASSWORD
        volumes:
          - my-service-db-data:/var/lib/mysql
    
    volumes:
      my-service-db-data:
    

    这将在启动堆栈时自动为您分配一个 docker 卷,并在您运行 docker-compose down -v 时将其删除。


    例如,如果我在.env 中有以下内容:

    MY_SERVICE_DB_ROOT_PASSWORD=secret
    MY_SERVICE_DB_APP_USER=myservice
    MY_SERVICE_DB_APP_PASSWORD=secret
    

    我可以调出堆栈:

    docker-compose up -d
    

    然后连接mysql并建表:

    $ mysql -h docker -u myservice -psecret my_service_db_local
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MySQL connection id is 10
    Server version: 8.0.23 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MySQL [my_service_db_local]> create table testtable (id int);
    Query OK, 0 rows affected (0.065 sec)
    
    MySQL [my_service_db_local]> show tables;
    +-------------------------------+
    | Tables_in_my_service_db_local |
    +-------------------------------+
    | testtable                     |
    +-------------------------------+
    1 row in set (0.004 sec)
    
    MySQL [my_service_db_local]> ^DBye
    

    现在,如果我使用 -v 降低堆栈:

    $ docker-compose down -v
    Stopping my-main-db ... done
    WARNING: Found orphan containers (docker_test_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
    Removing my-main-db ... done
    Removing network docker_default
    Removing volume docker_my-service-db-data
    

    ...你可以看到Docker已经删除了docker_my-service-db-data 体积。如果我们重新启动堆栈:

    $ docker-compose up -d
    Creating network "docker_default" with the default driver
    Creating volume "docker_my-service-db-data" with default driver
    WARNING: Found orphan containers (docker_test_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
    Creating my-main-db ... done
    

    我们可以连接mysql,看到表已经不存在了, 因为数据库是从头开始重新创建的:

    $ mysql -h docker -u myservice -psecret my_service_db_local
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MySQL connection id is 8
    Server version: 8.0.23 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MySQL [my_service_db_local]> show tables;
    Empty set (0.004 sec)
    
    MySQL [my_service_db_local]>
    

    【讨论】:

    • 感谢@larsks (+1) 但这似乎不起作用。我确保没有运行(通过docker ps),手动删除我的数据文件夹(my-service-db-data/),应用您的更改,运行 docker-compose up(在我的问题中发布相同的命令),添加一些数据,关闭它关闭(没有-v 选项),重新启动它,确认数据仍然存在,关闭它(这次使用-v 选项),然后再次启动它。数据还在。我错过了什么吗?
    • @hotmeatballsoup 我在问题中添加了一个完整的示例。如果您看到不同的行为,请确保您使用的正是此答案中的 Dockerfile,并且当您使用 -v 降低堆栈时,您会看到来自 Docker 的相同消息(特别是 Removing volume docker_my-service-db-data) .
    • 有趣,当我 docker-compose up 命令上指定 -d 时,这些都不起作用(当我使用 docker-compose down 时,永远不会删除数据目录-v)。但如果我将-d 添加到up 命令,一切正常。谢谢!
    猜你喜欢
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2020-01-21
    • 2016-07-09
    • 1970-01-01
    • 2011-09-01
    • 2013-05-21
    相关资源
    最近更新 更多