我希望能够运行一个脚本,以尽可能少的手动步骤将我的应用程序部署到新服务器,而不向全世界公开数据库密码。
该应用程序由一个 Web 应用程序(nginx + 自定义内容)和一个 mysql 数据库组成。我知道如何自动部署它,但不安全:只需将 root 密码存储在 docker-compose 中以及 Web 应用程序配置中的某个位置。显然,这根本不安全。
我知道如何安全地部署它:当前mySQL 文档建议部署默认的 mySQL 映像,grep 生成的 root 密码,然后在容器内运行 mysql 以将此密码更改为“您选择的密码”。然后,我想我必须将这个“我选择的密码”放入 Web 应用程序配置中,这样我的 Web 应用程序才能连接到数据库。
我不知道的是,自动且安全地部署 mySQL 的推荐方法是什么。我可以在部署期间生成“我选择的密码”,但如果我无论如何都要将其放入配置中,那么为什么要费心使用 mySQL 一次性随机生成的密码呢?有人可以告诉我最佳实践吗?
答案1
请参阅官方指南撰写时的环境变量。
您希望您docker-compose.yml
致力于源代码控制,因此密码不应该在那里。根据官方dockerhub 上的 mysql 文档您需要提供的主要变量是MYSQL_ROOT_PASSWORD
。
事实上,他们的示例docker run
通过-e
标志为命令提供了这一点:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
这最终可能会出现在日志中,因此我将其.env
与项目根目录中的其他配置变量一起放在一个文件中。
# .env
MYSQL_ROOT_PASSWORD=my-secret-pw
然后在撰写文件中引用此.env
文件:
version: '3.1'
services:
db:
image: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
env_file:
- .env
您还可以将该行添加.env
到.gitignore
项目内的文件中,以便不会意外提交机密。
然后再通过其他方式将文件部署.env
到各个环境。当然一定要chmod 600 .env
。