简体   繁体   English

关闭 Docker 时分离卷(用于重新启动)

[英]Detaching volumes (for a fresh restart) when shutting down Docker

I have a Docker Compose (file is named my-main-db.yml ) that creates a MySQL 8.0 container:我有一个 Docker Compose(文件名为my-main-db.yml ),它创建了一个 MySQL 8.0 容器:

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

To fire this up I run:为了启动它,我运行:

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

And it runs just fine, I can connect to it and also see it running via docker ps .它运行得很好,我可以连接到它,还可以看到它通过docker ps运行。

If I want to stop this container and keep all the data inside of it, I shut it down with:如果我想停止此容器并将所有数据保留在其中,我将其关闭:

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

But if I want to stop this container and erase all the data inside of it, so that it starts up brand new (and clean), my understanding is that I need to detach or delete the volume.但是如果我想停止这个容器并删除其中的所有数据,以便它以全新的方式启动(并且干净),我的理解是我需要分离或删除卷。 So I have been trying to shut it down like so:所以我一直试图像这样关闭它:

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

However, when I do this, and then start it back up, my data is still all there, whereas I was hoping for a brand new (empty) database.但是,当我这样做,然后重新启动它时,我的数据仍然存在,而我希望有一个全新的(空)数据库。

Can anyone spot where I'm going awry?谁能发现我哪里出错了?

docker-compose down -v will delete named volumes , but it won't delete directories you've mounted as bind mounts (as in your configuration). docker-compose down -v将删除命名的卷,但它不会删除您作为绑定挂载挂载的目录(如您的配置中所示)。 For that you would need to use rm -rf yourself.为此,您需要自己使用rm -rf

If you want docker-compose to manage the volumes, used a named volume instead:如果您希望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:

This will allocate a docker volume for you automatically when starting up the stack, and will remove it when you run docker-compose down -v .这将在启动堆栈时自动为您分配 docker 卷,并在您运行docker-compose down -v时将其删除。


For example, if I have the following in .env :例如,如果我在.env中有以下内容:

MY_SERVICE_DB_ROOT_PASSWORD=secret
MY_SERVICE_DB_APP_USER=myservice
MY_SERVICE_DB_APP_PASSWORD=secret

I can bring up the stack:我可以调出堆栈:

docker-compose up -d

And then connect to mysql and create a table:然后连接到 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

Now if I bring down the stack with -v :现在,如果我使用-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

...you can see that Docker has removed the docker_my-service-db-data volume. ...您可以看到 Docker 已删除docker_my-service-db-data卷。 If we restart the stack:如果我们重新启动堆栈:

$ 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

We can connect to mysql and see that the table no longer exists, because the database has been re-created from scratch:我们可以连接到 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]>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM