【问题标题】:Use Docker env vars with PHP 5.2.x在 PHP 5.2.x 中使用 Docker 环境变量
【发布时间】: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 以远程读取数据库凭据也是如此。


我还可以尝试什么方法让此代码以最少的更改按原样运行?

我想到的选项:

  1. 启动一个公开预配置环境的辅助 REST 服务器,然后从 PHP 请求该服务器... 看起来很老套,但比在任何代码中硬编码数据库凭据要好,并且可以达到与使用 Vault 类似的结果。
  2. 挂载我的.env 文件,然后将其解析出来,但这需要更多代码更改,以后无论如何都会删除

【问题讨论】:

  • 将所有敏感信息放在一个文件中。使用 gpg 使用密码加密文件。该文件现在可以安全地保存在其余代码旁边。在启动php-fpm 之前,使用 gpg 解密包含敏感数据的文件,使用作为 ENV 提供的密码,以便 php 可以从中读取。虽然我相信你的 hacky 想法不如我的 hacky :))。是的,您还需要将 gpg 添加到该 php-fpm 图像中。
  • 根据我的经验,Docker env 的东西似乎总是非常棘手。但我注意到一件事——你没有使用the environment syntax described in the docs。试试- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}?
  • @Don'tPanic 都试过了。它们的运作方式相同。如果我执行到容器中,运行env | grep DB,我会看到值

标签: php docker environment-variables fpm


【解决方案1】:

很可能这些环境在您正在使用的图像中的某处被覆盖。 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 配置,因此可以用作副本集 - 就像一个魅力。

【讨论】:

  • “最有可能”?怀疑它,考虑到it's actually a feature。而且我可以将这些值命名为任何值,它们变成空的,所以当它“清除”或“未得到”时,“覆盖”似乎是错误的
  • 您的链接显示其“php 问题”。无论如何,你要求一个简单的解决方案,就是这样。只需在命令中修改php-fpm.conf,如echo "" >> ...
  • 那个文件是 XML,所以看不出有什么帮助。那里的 github cmets 中的 bash 脚本也不起作用,即使我看到该文件确实与我的其他 php-fpm.conf.d 文件一起加载
【解决方案2】:

我在 /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-compose

environment:
    APP_DB_HOST: mariadb:3306
    APP_DB_USER: ${DB_USER}
    APP_DB_PASSWORD: ${DB_PASSWORD} 
    APP_DB_DATABASE: ${DB_DATABASE}

【讨论】:

    猜你喜欢
    • 2020-12-07
    • 2016-02-20
    • 2017-12-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 2019-07-26
    • 2015-09-13
    相关资源
    最近更新 更多