使用 docker-compose 挂载文件中的环境变量来初始化 mysql

Joh*_*ohn 5 mysql docker docker-compose

/docker-entrypoint-initdb.d当我的初始化脚本需要环境变量时,我在通过 docker-compose 初始化 mysql 时遇到问题。

我有以下docker-compose.yml文件。

version: '3'

services:
  mysql:
    image: mysql
    container_name: mysql
    restart: always
    env_file: .env
    environment:
      - MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASS
      - MYSQL_USER=$MYSQL_USER
      - MYSQL_PASSWORD=$MYSQL_PASS
      - MYSQL_DB=$MYSQL_DB
    volumes:
      - db-data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - $MYSQL_PORT:3306

volumes:
  db-data:
Run Code Online (Sandbox Code Playgroud)

这是我的./init.sql

CREATE DATABASE IF NOT EXISTS ${MYSQL_DB};
GRANT ALL PRIVILEGES ON ${MYSQL_DB}.* TO '${MYSQL_USER}'@'%';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');

Run Code Online (Sandbox Code Playgroud)

当我运行时docker-compose up,我收到一个错误./init.sql,内容如下:

mysql    | 2021-07-16 14:53:17+00:00 [Note] [Entrypoint]: /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.sql
mysql    | ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '{MYSQL_DB}' at line 1
Run Code Online (Sandbox Code Playgroud)

如果我更改~/init.sql为使用这样的硬编码值,一切都会完美运行:

CREATE DATABASE IF NOT EXISTS testingdb;
GRANT ALL PRIVILEGES ON testingdb.* TO 'testinguser'@'%';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
# where testingdb and testinguser is my .env.MYSQL_DB and .env.MYSQL_USER respectively
Run Code Online (Sandbox Code Playgroud)

如何在docker的卷挂载文件中使用环境变量?

小智 10

环境变量可以在文件中使用.sh,所以你可以像这样实现你想要的:

创建一个init_db.sh文件(而不是init_db.sql

然后在init_db.sh文件中:

echo "** Creating default DB and users"

mysql -u root -p$MYSQL_ROOT_PASSWORD --execute \
"CREATE DATABASE IF NOT EXISTS $MYSQL_DB;
GRANT ALL PRIVILEGES ON $MYSQL_DB.* TO '$MYSQL_USER'@'%';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"

echo "** Finished creating default DB and users"
Run Code Online (Sandbox Code Playgroud)