mysql - MySQL Docker 容器在首次运行后存储密码
问题描述
到目前为止,我在 Docker 方面的所有经验都让我相信容器是无状态的。
如果是这样,如果我在没有指定卷或绑定挂载的情况下启动它,为什么我的容器会存储我在第一次运行后将其更改为的密码?我特别困惑,因为我对 dbms 所做的其他编辑都没有保留(比如创建表)。
其他详细信息:
版本:
1. Docker - 18.09.0 build 4d60db4
2. 图像 - mysql/mysql-server:latest
命令:
1. $ docker run --name=sql -d mysql/mysql-server:latest
2.$ docker logs sql 2>&1 | grep GENERATED
获取首次登录时生成的密码
3. $ docker exec -it sql mysql -uroot -p
4. mysql> Enter Password: <generated password>
5. mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'stkoverflw';
6. mysql> exit
7. $ docker stop sql
8. $ docker start sql
9. $ docker exec -it sql mysql -uroot -p
10.mysql> Enter Password: <stkoverflw>
密码配置如何在容器重新启动时保持不变?
解决方案
容器不是无状态的。容器很容易创建和销毁,因此它们可以用来运行无状态的服务,但每个容器本身都是有状态的。
当容器运行时,有一个包含其根文件系统的卷。您不必告诉 Docker 创建它。Docker 必须创建它,否则容器的文件会去哪里?
当您说docker stop
时,容器会停止运行,但不会被销毁。当您说docker start
时,相同的容器会以相同的根卷恢复。那就是更改后的密码仍然存在的地方。在容器中运行的进程已停止并启动了一个新进程(因此内存中保存的状态将丢失),但文件系统仍然存在。
要摆脱容器(包括更改的密码),请说docker rm
. 然后你可以说docker run
从头开始。
推荐阅读
- javascript - 如何在没有确认按钮的情况下提交 Hcaptcha。(2验证码/数据库)
- oracle - 如何覆盖 Oracle Apex 以上传文件
- c# - 来自 Azure 函数中使用的类库的日志消息
- python - Spacy 在指定单词之前查找文本
- ruby-on-rails - 我们可以在 Ruby on Rails 应用程序中使用 SendGrid 模板和 ActionMailer 吗?
- python - 导入portalocker时出现锁文件语法错误
- wpf - 如何像默认上下文菜单一样为 ScrollBar 的自定义上下文菜单获取默认本地化?
- javascript - ReferenceError - d3 未定义
- office-js - Outlook for Mac 用户的“新 Outlook”中缺少加载项
- arrays - 按jsonb中数组长度查询jsonb类型的列