mysql - 如果我在 swarm 中使用 .env 文件,则未为 mariadb 容器设置 MYSQL_ROOT_PASSWORD 环境变量
问题描述
当我尝试使用 docker swarm 设置集群时,我收到此错误:
$ docker logs 6ea0f7290cb0
2020-11-30 10:46:08+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 1:10.5.8+maria~focal started.
2020-11-30 10:46:08+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-11-30 10:46:08+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 1:10.5.8+maria~focal started.
2020-11-30 10:46:08+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
奇怪的是,如果我使用 docker-compose 工具,一切都运行良好。
要复制此问题,请按照以下步骤操作。
创建一个.env
文件:
DB_NAME=nest
DB_USERNAME=nest
DB_PASSWORD=nest
DB_ROOT_PASSWORD=nest
创建一个docker-compose.yml
文件:
version: '3.8'
services:
db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
如果我使用 command docker-compose up -d
,我可以检查该命令是否一切正常docker-compose ps
:
$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------
db-debug_db_1 docker-entrypoint.sh mysqld Up 3306/tcp
如果我使用该命令docker stack deploy -c docker-compose.yml db
,我可以使用该命令检查数据库是否未启动docker service ls
:
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ux1p4k6vwiyh db_db replicated 0/1 mariadb:latest
解决方案
docker-compose
并且docker stack deploy
在解析 compose.yml 文件的方式上存在许多差异。其中之一是后者不会自动处理 .env 文件。(参考) 因此,您需要明确引用它:
services:
db:
image: mariadb
env_file: .env
推荐阅读
- tensorflow - tensorflow如何减少高“设备到设备”负载
- android - 将 targetSdkVersion 从 28 更改为 29 后,此应用与您的设备不兼容
- google-bigquery - 如果来自信息架构的 bigquery 属性,如何获取策略标签
- c - 修改rodata字符串文字
- firebase - 如果文档的属性与请求属性匹配,则读取 Firebase Firestore 文档
- c - 用于同步的全局信号量 - 计数器
- java - 在 NetBeans 12.0 中,我收到错误无法访问 java.lang
- node.js - 通过 id 属性使用 gridfs 存储桶从文件集合中检索文档时遇到问题
- python - 使用 Python 嗅探协议
- java - 如何在 Maven 发布插件中使用“projectVersionPolicyId”?