You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 14:54:03