【发布时间】:2020-11-12 09:22:37
【问题描述】:
我继承了一些用 PHP 5.2 编写的代码,我没有自己安装,而是让它在 Docker 容器中运行。
该系统还依赖于 MySQL,因此使用 Docker Compose 并将数据库凭据提取到更安全的位置...
version: "3"
services:
mariadb:
image: mariadb:10.5
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_DATABASE: ${DB_DATABASE}
volumes:
- ./conf/mariadb/initdb.d:/docker-entrypoint-initdb.d/:ro
ports:
- "3306:3306"
nginx:
image: nginx:alpine
depends_on:
- php-fpm
volumes:
- ${LOCAL_WORKING_DIR}:${REMOTE_WORKING_DIR}
- ./conf/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./conf/nginx/conf.d/:/etc/nginx/conf.d/
# - ./conf/nginx/ssl/:/etc/nginx/ssl/
ports:
- "8080:80"
# - "8443:443"
php-fpm:
build:
context: docker/app
args:
APP_ENV: ${APP_ENV}
PHP_VERSION: ${PHP_VERSION}
REMOTE_WORKING_DIR: ${REMOTE_WORKING_DIR}
depends_on:
- mariadb
working_dir: ${REMOTE_WORKING_DIR}
volumes:
- ${LOCAL_WORKING_DIR}:${REMOTE_WORKING_DIR}
- ./conf/php/www.conf:/usr/local/etc/php-fpm.d/www.conf:ro
# - ./conf/php/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini:ro
- ./conf/php/php-ini-overrides.ini:/usr/local/etc/php/conf.d/99-overrides.ini:ro
environment:
DB_HOST: mariadb:3306
DB_USER: ${DB_USER}
DB_PASSWORD: ${DB_PASSWORD}
DB_DATABASE: ${DB_DATABASE}
ports:
- "9000:9000"
Dockerfile
FROM devilbox/php-fpm:5.2-base
EXPOSE 9000
CMD ["php-fpm"]
使用phpinfo() 不会显示$_ENV 或$_SERVER 中的这些值,并且getenv() 返回空字符串。
我看到最新的php-fpm 相关问题说这是通过clear_env: no、but this is only available in PHP-FPM 5.4+ 解决的
我曾尝试使用composer 安装dotenv,但这似乎需要PHP7。尝试安装 Vault 以远程读取数据库凭据也是如此。
我还可以尝试什么方法让此代码以最少的更改按原样运行?
我想到的选项:
- 启动一个公开预配置环境的辅助 REST 服务器,然后从 PHP 请求该服务器... 看起来很老套,但比在任何代码中硬编码数据库凭据要好,并且可以达到与使用 Vault 类似的结果。
- 挂载我的
.env文件,然后将其解析出来,但这需要更多代码更改,以后无论如何都会删除
【问题讨论】:
-
将所有敏感信息放在一个文件中。使用 gpg 使用密码加密文件。该文件现在可以安全地保存在其余代码旁边。在启动
php-fpm之前,使用 gpg 解密包含敏感数据的文件,使用作为 ENV 提供的密码,以便 php 可以从中读取。虽然我相信你的 hacky 想法不如我的 hacky :))。是的,您还需要将 gpg 添加到该 php-fpm 图像中。 -
根据我的经验,Docker env 的东西似乎总是非常棘手。但我注意到一件事——你没有使用the
environmentsyntax described in the docs。试试- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}? -
@Don'tPanic 都试过了。它们的运作方式相同。如果我执行到容器中,运行
env | grep DB,我会看到值
标签: php docker environment-variables fpm