在PHP应用的Docker容器中使用Docker Secrets读取MySQL密码的问题
正确读取Docker Secret中MySQL密码的方案
你当前的docker-compose配置没有问题,出现读取失败的核心原因是:Docker Secret默认以文件形式挂载到容器的/run/secrets/目录下,不会自动注入为名为mysql_password的环境变量。你配置的MYSQL_PASSWORD_FILE环境变量仅存储了Secret文件的路径,需要手动读取该路径下的文件内容才能拿到真实密码。
方案1:直接修改PHP代码读取(最推荐)
直接在代码中读取Secret文件内容即可,该方案兼容性最强,示例代码如下:
// 使用getenv读取环境变量不受php.ini的variables_order配置影响,兼容性更好 $secretPath = getenv('MYSQL_PASSWORD_FILE'); if ($secretPath && file_exists($secretPath)) { // trim用于去除创建Secret时可能带入的换行符 $mysqlPassword = trim(file_get_contents($secretPath)); } else { // 兜底逻辑,兼容普通环境变量部署场景 $mysqlPassword = getenv('MYSQL_PASSWORD') ?: ''; }
方案2:容器启动时自动导出为环境变量(无需修改PHP代码)
如果不想改动现有PHP代码,可以修改docker-compose.yml中php服务的启动命令,在启动php-fpm前将Secret内容导出为对应环境变量,修改后的php服务配置如下:
services: php: image: 'php:7.2-fpm' build: context: ./docker dockerfile: php.Dockerfile volumes: - './app:/var/www/html' environment: MYSQL_PASSWORD_FILE: /run/secrets/mysql_password secrets: - mysql_password # 新增启动命令,提前导出Secret内容为环境变量,注意变量名大小写和代码读取的保持一致 command: sh -c "export mysql_password=\$(cat /run/secrets/mysql_password) && php-fpm"
修改后你原来的$_ENV["mysql_password"]写法就可以正常读取到密码。
额外注意事项
- 创建Docker Secret时建议使用
echo -n "你的真实密码" | docker secret create mysql_password -命令,-n参数可以避免写入多余的换行符,导致密码校验失败。 - 如果使用
$_ENV读取环境变量失败,可检查php.ini配置中的variables_order参数,确保参数值包含字符E,否则$_ENV全局变量不会被初始化,优先使用getenv函数读取环境变量兼容性更强。
内容的提问来源于stack exchange,提问作者Shrikant
相关产品推荐
相关产品推荐

