Docker-Compose环境文件使用问题:.env文件无法被检测
问题排查与解决
1. 卷挂载路径配置错误
要把本地.env挂载到容器内/docker-entrypoint-initdb.d/.env,Docker Compose里的挂载规则必须明确指定文件名。如果只写./.env:/docker-entrypoint-initdb.d/,容器会把本地.env当成目录而非文件,脚本自然找不到。正确的挂载配置应该是:
services: mysql: image: mysql:8.0 volumes: - ./generate-init.sh:/docker-entrypoint-initdb.d/generate-init.sh - ./.env:/docker-entrypoint-initdb.d/.env # 此处必须指定目标文件名 # 其他配置...
2. 脚本内路径引用错误
检查你的generate-init.sh,确保读取.env时用的是绝对路径。如果脚本里写的是相对路径.env,而脚本执行时的工作目录不是/docker-entrypoint-initdb.d/,就会找不到文件。修改脚本:
#!/bin/bash # 用绝对路径加载.env source /docker-entrypoint-initdb.d/.env # 后续创建用户、表的SQL逻辑 # 比如:mysql -u root -p"${MYSQL_ROOT_PASSWORD}" <<EOF # CREATE USER ...; # CREATE DATABASE ...; # EOF
3. Docker Compose执行目录的上下文问题
如果执行docker-compose up的目录不是docker-compose.yml和.env所在的目录,./.env的相对路径会指向执行命令的目录,而非文件实际所在目录。解决办法:
- 切换到
docker-compose.yml所在目录再执行命令 - 或者挂载时用绝对路径:
volumes: - /你本地的绝对路径/.env:/docker-entrypoint-initdb.d/.env
4. 文件权限问题
本地.env文件权限如果过于严格(比如仅root可读),容器内的mysql进程(默认运行用户为mysql)可能没有读取权限,导致脚本报错。可以先调整本地文件权限:
chmod 644 .env
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

