为什么“--force-recreate”不重建我的 docker mysql 图像?
Why isn't "--force-recreate" rebuilding my docker mysql image?
我创建了一个 docker MySql 5.7 图像,然后想更改几个名称。我的 docker-compose.yml 文件结果是这样的
version: '3.3'
services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: 'maps_data'
# So you don't have to use root, but you can if you like
MYSQL_USER: 'myuser'
# You can use whatever password you like
MYSQL_PASSWORD: 'password'
# Password for root access
MYSQL_ROOT_PASSWORD: 'password'
ports:
# <Port exposed> : < MySQL Port running inside container>
- '3406:3306'
expose:
# Opens port 3406 on the container
- '3406'
# Where our data will be persisted
volumes:
- my-db:/var/lib/mysql
# Names our volume
volumes:
my-db:
我想从头开始重建我的形象,我认为 "docker-compose up -d --force-recreate" 是正确的选择...
localhost:maps davea$ docker-compose down
Stopping maps_db_1 ... done
Removing maps_db_1 ... done
Removing network maps_default
localhost:maps davea$
localhost:maps davea$ docker-compose up -d --force-recreate
Creating network "maps_default" with the default driver
Creating maps_db_1 ... done
maps_db_1 is up-to-date
Attaching to maps_db_1
db_1 | 2020-01-28 23:16:19+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.29-1debian9 started.
db_1 | 2020-01-28 23:16:19+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
db_1 | 2020-01-28 23:16:19+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.29-1debian9 started.
db_1 | 2020-01-28T23:16:20.051193Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
db_1 | 2020-01-28T23:16:20.052820Z 0 [Note] mysqld (mysqld 5.7.29) starting as process 1 ...
db_1 | 2020-01-28T23:16:20.056843Z 0 [Note] InnoDB: PUNCH HOLE support available
db_1 | 2020-01-28T23:16:20.056912Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
db_1 | 2020-01-28T23:16:20.056928Z 0 [Note] InnoDB: Uses event mutexes
db_1 | 2020-01-28T23:16:20.056944Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
db_1 | 2020-01-28T23:16:20.056959Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
db_1 | 2020-01-28T23:16:20.056975Z 0 [Note] InnoDB: Using Linux native AIO
db_1 | 2020-01-28T23:16:20.057616Z 0 [Note] InnoDB: Number of pools: 1
db_1 | 2020-01-28T23:16:20.057757Z 0 [Note] InnoDB: Using CPU crc32 instructions
db_1 | 2020-01-28T23:16:20.059523Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
db_1 | 2020-01-28T23:16:20.070356Z 0 [Note] InnoDB: Completed initialization of buffer pool
db_1 | 2020-01-28T23:16:20.073066Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
db_1 | 2020-01-28T23:16:20.084799Z 0 [Note] InnoDB: Highest supported file format is Barracuda.
db_1 | 2020-01-28T23:16:20.097204Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables
db_1 | 2020-01-28T23:16:20.097391Z 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
db_1 | 2020-01-28T23:16:20.134350Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
db_1 | 2020-01-28T23:16:20.135692Z 0 [Note] InnoDB: 96 redo rollback segment(s) found. 96 redo rollback segment(s) are active.
db_1 | 2020-01-28T23:16:20.135748Z 0 [Note] InnoDB: 32 non-redo rollback segment(s) are active.
db_1 | 2020-01-28T23:16:20.136582Z 0 [Note] InnoDB: Waiting for purge to start
db_1 | 2020-01-28T23:16:20.192038Z 0 [Note] InnoDB: 5.7.29 started; log sequence number 12442166
db_1 | 2020-01-28T23:16:20.192864Z 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
db_1 | 2020-01-28T23:16:20.193111Z 0 [Note] Plugin 'FEDERATED' is disabled.
db_1 | 2020-01-28T23:16:20.194918Z 0 [Note] InnoDB: Buffer pool(s) load completed at 200128 23:16:20
db_1 | 2020-01-28T23:16:20.198841Z 0 [Note] Found ca.pem, server-cert.pem and server-key.pem in data directory. Trying to enable SSL support using them.
db_1 | 2020-01-28T23:16:20.198900Z 0 [Note] Skipping generation of SSL certificates as certificate files are present in data directory.
db_1 | 2020-01-28T23:16:20.199651Z 0 [Warning] CA certificate ca.pem is self signed.
db_1 | 2020-01-28T23:16:20.199712Z 0 [Note] Skipping generation of RSA key pair as key files are present in data directory.
db_1 | 2020-01-28T23:16:20.200248Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
db_1 | 2020-01-28T23:16:20.200400Z 0 [Note] IPv6 is available.
db_1 | 2020-01-28T23:16:20.200413Z 0 [Note] - '::' resolves to '::';
db_1 | 2020-01-28T23:16:20.200633Z 0 [Note] Server socket created on IP: '::'.
db_1 | 2020-01-28T23:16:20.204771Z 0 [Warning] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
db_1 | 2020-01-28T23:16:20.217005Z 0 [Note] Event Scheduler: Loaded 0 events
db_1 | 2020-01-28T23:16:20.217626Z 0 [Note] mysqld: ready for connections.
db_1 | Version: '5.7.29' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)
但是,当我以 root 用户身份登录时,我在那里看不到我的数据库 "maps_data"。我在进行更改之前看到了旧的 "db" 数据库 ...
localhost:maps davea$ mysql -u root -h 127.0.0.1 --port=3406 -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.29 MySQL Community Server (GPL)
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases
-> ;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
完全从头开始并重建我的 docker MySql 图像的正确方法是什么?
docker-compose 的 --force-recreate 将删除容器并根据提供的图像 name/Id 构建一个新容器(在您的情况下为 mysql:5.7)。我想这是应该发生的。您可以判断是否查看 docker-compose up ... --force-recreate 之前和之后的容器 ID。如果容器的 ID 发生变化,那么 docker-compose 确实从 mysql:5.7 图像创建了一个新容器。
如果您查看 docker-compose yaml 文件,您可以看到它将使用名为 'my-db' 的 docker 卷安装在 /var/lib/mysql 内容器。 Docker 卷是持久的(这是它们的主要用例之一)因此当创建新容器时它会将 'my-db' 卷挂载回 /var/lib/mysql,这会将您的数据持久保存到新容器.
https://docs.docker.com/storage/volumes/
Volumes are the preferred mechanism for persisting data generated by and used by Docker containers.
如果您想真正从头开始,您要做的是发出 docker-compose down
(这将删除容器)并确保 'my-db' 卷也被删除(使用docker 卷 ls)。如果该卷仍然存在,请使用 docker volume rm my-db
删除该卷。之后,发出 docker-compose up -d
它将构建一个新卷(将为空)并且新容器将在 /var/lib/mysql.
中看不到任何文件
告诉 docker-compose 通过将 --rmi
标志传递给 down 来删除图像:
docker-compose down --rmi all
这告诉 compose 停止并删除所有容器、网络,并删除 docker-compose 文件中任何服务使用的所有图像。此外,您可以传递 --volumes
以删除所有命名卷(在您的情况下为 my-db
)。但是,这将导致您的 docker-compose 文件中的命名卷被删除,并且您会丢失该数据。确保这是您想要的。
然后,要使用新图像重新运行 应用程序,请使用 --build
选项和 docker-compose up 在启动容器之前构建图像。
docker-compose up -d --build
我创建了一个 docker MySql 5.7 图像,然后想更改几个名称。我的 docker-compose.yml 文件结果是这样的
version: '3.3'
services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: 'maps_data'
# So you don't have to use root, but you can if you like
MYSQL_USER: 'myuser'
# You can use whatever password you like
MYSQL_PASSWORD: 'password'
# Password for root access
MYSQL_ROOT_PASSWORD: 'password'
ports:
# <Port exposed> : < MySQL Port running inside container>
- '3406:3306'
expose:
# Opens port 3406 on the container
- '3406'
# Where our data will be persisted
volumes:
- my-db:/var/lib/mysql
# Names our volume
volumes:
my-db:
我想从头开始重建我的形象,我认为 "docker-compose up -d --force-recreate" 是正确的选择...
localhost:maps davea$ docker-compose down
Stopping maps_db_1 ... done
Removing maps_db_1 ... done
Removing network maps_default
localhost:maps davea$
localhost:maps davea$ docker-compose up -d --force-recreate
Creating network "maps_default" with the default driver
Creating maps_db_1 ... done
maps_db_1 is up-to-date
Attaching to maps_db_1
db_1 | 2020-01-28 23:16:19+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.29-1debian9 started.
db_1 | 2020-01-28 23:16:19+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
db_1 | 2020-01-28 23:16:19+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.29-1debian9 started.
db_1 | 2020-01-28T23:16:20.051193Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
db_1 | 2020-01-28T23:16:20.052820Z 0 [Note] mysqld (mysqld 5.7.29) starting as process 1 ...
db_1 | 2020-01-28T23:16:20.056843Z 0 [Note] InnoDB: PUNCH HOLE support available
db_1 | 2020-01-28T23:16:20.056912Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
db_1 | 2020-01-28T23:16:20.056928Z 0 [Note] InnoDB: Uses event mutexes
db_1 | 2020-01-28T23:16:20.056944Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
db_1 | 2020-01-28T23:16:20.056959Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
db_1 | 2020-01-28T23:16:20.056975Z 0 [Note] InnoDB: Using Linux native AIO
db_1 | 2020-01-28T23:16:20.057616Z 0 [Note] InnoDB: Number of pools: 1
db_1 | 2020-01-28T23:16:20.057757Z 0 [Note] InnoDB: Using CPU crc32 instructions
db_1 | 2020-01-28T23:16:20.059523Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
db_1 | 2020-01-28T23:16:20.070356Z 0 [Note] InnoDB: Completed initialization of buffer pool
db_1 | 2020-01-28T23:16:20.073066Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
db_1 | 2020-01-28T23:16:20.084799Z 0 [Note] InnoDB: Highest supported file format is Barracuda.
db_1 | 2020-01-28T23:16:20.097204Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables
db_1 | 2020-01-28T23:16:20.097391Z 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
db_1 | 2020-01-28T23:16:20.134350Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
db_1 | 2020-01-28T23:16:20.135692Z 0 [Note] InnoDB: 96 redo rollback segment(s) found. 96 redo rollback segment(s) are active.
db_1 | 2020-01-28T23:16:20.135748Z 0 [Note] InnoDB: 32 non-redo rollback segment(s) are active.
db_1 | 2020-01-28T23:16:20.136582Z 0 [Note] InnoDB: Waiting for purge to start
db_1 | 2020-01-28T23:16:20.192038Z 0 [Note] InnoDB: 5.7.29 started; log sequence number 12442166
db_1 | 2020-01-28T23:16:20.192864Z 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
db_1 | 2020-01-28T23:16:20.193111Z 0 [Note] Plugin 'FEDERATED' is disabled.
db_1 | 2020-01-28T23:16:20.194918Z 0 [Note] InnoDB: Buffer pool(s) load completed at 200128 23:16:20
db_1 | 2020-01-28T23:16:20.198841Z 0 [Note] Found ca.pem, server-cert.pem and server-key.pem in data directory. Trying to enable SSL support using them.
db_1 | 2020-01-28T23:16:20.198900Z 0 [Note] Skipping generation of SSL certificates as certificate files are present in data directory.
db_1 | 2020-01-28T23:16:20.199651Z 0 [Warning] CA certificate ca.pem is self signed.
db_1 | 2020-01-28T23:16:20.199712Z 0 [Note] Skipping generation of RSA key pair as key files are present in data directory.
db_1 | 2020-01-28T23:16:20.200248Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
db_1 | 2020-01-28T23:16:20.200400Z 0 [Note] IPv6 is available.
db_1 | 2020-01-28T23:16:20.200413Z 0 [Note] - '::' resolves to '::';
db_1 | 2020-01-28T23:16:20.200633Z 0 [Note] Server socket created on IP: '::'.
db_1 | 2020-01-28T23:16:20.204771Z 0 [Warning] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
db_1 | 2020-01-28T23:16:20.217005Z 0 [Note] Event Scheduler: Loaded 0 events
db_1 | 2020-01-28T23:16:20.217626Z 0 [Note] mysqld: ready for connections.
db_1 | Version: '5.7.29' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)
但是,当我以 root 用户身份登录时,我在那里看不到我的数据库 "maps_data"。我在进行更改之前看到了旧的 "db" 数据库 ...
localhost:maps davea$ mysql -u root -h 127.0.0.1 --port=3406 -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.29 MySQL Community Server (GPL)
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases
-> ;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
完全从头开始并重建我的 docker MySql 图像的正确方法是什么?
docker-compose 的 --force-recreate 将删除容器并根据提供的图像 name/Id 构建一个新容器(在您的情况下为 mysql:5.7)。我想这是应该发生的。您可以判断是否查看 docker-compose up ... --force-recreate 之前和之后的容器 ID。如果容器的 ID 发生变化,那么 docker-compose 确实从 mysql:5.7 图像创建了一个新容器。
如果您查看 docker-compose yaml 文件,您可以看到它将使用名为 'my-db' 的 docker 卷安装在 /var/lib/mysql 内容器。 Docker 卷是持久的(这是它们的主要用例之一)因此当创建新容器时它会将 'my-db' 卷挂载回 /var/lib/mysql,这会将您的数据持久保存到新容器.
https://docs.docker.com/storage/volumes/
Volumes are the preferred mechanism for persisting data generated by and used by Docker containers.
如果您想真正从头开始,您要做的是发出 docker-compose down
(这将删除容器)并确保 'my-db' 卷也被删除(使用docker 卷 ls)。如果该卷仍然存在,请使用 docker volume rm my-db
删除该卷。之后,发出 docker-compose up -d
它将构建一个新卷(将为空)并且新容器将在 /var/lib/mysql.
告诉 docker-compose 通过将 --rmi
标志传递给 down 来删除图像:
docker-compose down --rmi all
这告诉 compose 停止并删除所有容器、网络,并删除 docker-compose 文件中任何服务使用的所有图像。此外,您可以传递 --volumes
以删除所有命名卷(在您的情况下为 my-db
)。但是,这将导致您的 docker-compose 文件中的命名卷被删除,并且您会丢失该数据。确保这是您想要的。
然后,要使用新图像重新运行 应用程序,请使用 --build
选项和 docker-compose up 在启动容器之前构建图像。
docker-compose up -d --build