将 Docker 环境变量与 PHP 5.2.x 一起使用
Use Docker env vars with PHP 5.2.x
我继承了一些用 PHP 5.2 编写的代码,我没有自己安装,而是 运行ning 在 Docker容器。
该系统还依赖于 MySQL,因此使用 Docker 编写数据库凭据并将其提取到更安全的位置...
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"
Docker文件
FROM devilbox/php-fpm:5.2-base
EXPOSE 9000
CMD ["php-fpm"]
使用 phpinfo()
在 $_ENV
或 $_SERVER
和 getenv()
returns 空字符串中显示 none 个值。
我看到最新的 php-fpm
相关问题说这已通过 clear_env: no
、but this is only available in PHP-FPM 5.4+
解决
我曾尝试使用 composer
安装 dotenv
,但这似乎需要 PHP7。尝试安装 Vault 以远程读取数据库凭据也是如此。
我还可以尝试将此代码按原样 运行 进行最小更改吗?
我想到的选项:
- 启动一个暴露预配置环境的辅助 REST 服务器,然后从 PHP 请求该服务器...看起来很老套,但比在任何代码中硬编码数据库信用要好,并且会实现类似的效果使用 Vault 的结果。
- 挂载我的
.env
文件,然后将其解析出来,但这需要更多的代码更改,无论如何稍后都会删除
很可能这些环境在您正在使用的图像中的某处被覆盖。
docker compose 允许在启动时为 运行 定义一个命令。因此,您可以在启动时将环境变量覆盖为您需要的任何内容:
command: bash -c "DB_HOST='mariadb:3306' && DB_USER='some_user ... & ./start_something.sh"
编辑:
如评论所述 php 要求所有环境都在 php-fpm.conf
中。对我来说很奇怪,但是通过在 docker compose 的相同 command:
语句中将您需要的环境变量添加到此文件中,可以很容易地解决这个问题。简单 echo "ENV_NAME" >> ..../php-fpm.conf
应该能帮到你。
或者您可以修改 Dockerfile,使您的图像具有简单的 sh 脚本,该脚本会将所有环境变量转储到该 php 配置中。
我正在修改 mongo 配置,以便作为副本集工作 - 工作起来很有魅力。
我在 /usr/local/etc/php-fpm.conf
找到了一个包含环境变量的 XML 文件,并使用 dockerize
填充了它
<value name="environment">
<!-- Add docker environment variables -->
{{ range $k,$v := .Env }}{{ $parts := split $k "APP_" }}{{ if eq (len $parts) 2 -}}
<value name="{{ index $parts 1 }}">{{ $v }}</value>
{{ end }}{{- end -}}
<!-- End Docker Env -->
和docker-组成有
environment:
APP_DB_HOST: mariadb:3306
APP_DB_USER: ${DB_USER}
APP_DB_PASSWORD: ${DB_PASSWORD}
APP_DB_DATABASE: ${DB_DATABASE}
我继承了一些用 PHP 5.2 编写的代码,我没有自己安装,而是 运行ning 在 Docker容器。
该系统还依赖于 MySQL,因此使用 Docker 编写数据库凭据并将其提取到更安全的位置...
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"
Docker文件
FROM devilbox/php-fpm:5.2-base
EXPOSE 9000
CMD ["php-fpm"]
使用 phpinfo()
在 $_ENV
或 $_SERVER
和 getenv()
returns 空字符串中显示 none 个值。
我看到最新的 php-fpm
相关问题说这已通过 clear_env: no
、but this is only available in PHP-FPM 5.4+
我曾尝试使用 composer
安装 dotenv
,但这似乎需要 PHP7。尝试安装 Vault 以远程读取数据库凭据也是如此。
我还可以尝试将此代码按原样 运行 进行最小更改吗?
我想到的选项:
- 启动一个暴露预配置环境的辅助 REST 服务器,然后从 PHP 请求该服务器...看起来很老套,但比在任何代码中硬编码数据库信用要好,并且会实现类似的效果使用 Vault 的结果。
- 挂载我的
.env
文件,然后将其解析出来,但这需要更多的代码更改,无论如何稍后都会删除
很可能这些环境在您正在使用的图像中的某处被覆盖。 docker compose 允许在启动时为 运行 定义一个命令。因此,您可以在启动时将环境变量覆盖为您需要的任何内容:
command: bash -c "DB_HOST='mariadb:3306' && DB_USER='some_user ... & ./start_something.sh"
编辑:
如评论所述 php 要求所有环境都在 php-fpm.conf
中。对我来说很奇怪,但是通过在 docker compose 的相同 command:
语句中将您需要的环境变量添加到此文件中,可以很容易地解决这个问题。简单 echo "ENV_NAME" >> ..../php-fpm.conf
应该能帮到你。
或者您可以修改 Dockerfile,使您的图像具有简单的 sh 脚本,该脚本会将所有环境变量转储到该 php 配置中。
我正在修改 mongo 配置,以便作为副本集工作 - 工作起来很有魅力。
我在 /usr/local/etc/php-fpm.conf
找到了一个包含环境变量的 XML 文件,并使用 dockerize
<value name="environment">
<!-- Add docker environment variables -->
{{ range $k,$v := .Env }}{{ $parts := split $k "APP_" }}{{ if eq (len $parts) 2 -}}
<value name="{{ index $parts 1 }}">{{ $v }}</value>
{{ end }}{{- end -}}
<!-- End Docker Env -->
和docker-组成有
environment:
APP_DB_HOST: mariadb:3306
APP_DB_USER: ${DB_USER}
APP_DB_PASSWORD: ${DB_PASSWORD}
APP_DB_DATABASE: ${DB_DATABASE}