将 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$_SERVERgetenv() returns 空字符串中显示 none 个值。


我看到最新的 php-fpm 相关问题说这已通过 clear_env: nobut this is only available in PHP-FPM 5.4+

解决

我曾尝试使用 composer 安装 dotenv,但这似乎需要 PHP7。尝试安装 Vault 以远程读取数据库凭据也是如此。


我还可以尝试将此代码按原样 运行 进行最小更改吗?

我想到的选项:

  1. 启动一个暴露预配置环境的辅助 REST 服务器,然后从 PHP 请求该服务器...看起来很老套,但比在任何代码中硬编码数据库信用要好,并且会实现类似的效果使用 Vault 的结果。
  2. 挂载我的 .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}