首页 > 解决方案 > 如果我在 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

标签: mysqldockerdocker-composemariadbdocker-swarm

解决方案


docker-compose并且docker stack deploy在解析 compose.yml 文件的方式上存在许多差异。其中之一是后者不会自动处理 .env 文件。(参考) 因此,您需要明确引用它:

services:
  db:
    image: mariadb
    env_file: .env

推荐阅读