php - 在 PHP 5.2.x 中使用 Docker 环境变量

标签 php docker environment-variables fpm

我继承了一些用 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"
文件
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文件,然后解析它,但这需要更多的代码更改,无论如何以后都会删除
  • 最佳答案

    很可能那些 env 在您正在使用的图像中的某处被覆盖。
    docker compose 允许定义一个在启动时运行的命令。因此,您可以在启动时将 env vars 覆盖为您需要的任何内容:

    command: bash -c "DB_HOST='mariadb:3306' && DB_USER='some_user ... & ./start_something.sh"
    
    编辑:
    正如评论中提到的,php 要求所有 env 都在 php-fpm.conf 中.对我来说很奇怪,但是通过在同一个 command: 中将您需要的环境变量添加到此文件中来解决这个问题很容易。 docker compose 的声明。简单 echo "ENV_NAME" >> ..../php-fpm.conf应该可以帮助你。
    或者您可以修改 Dockerfile 以便您的图像具有简单的 sh 脚本,该脚本会将所有环境变量转储到该 php 配置中。
    我正在修改 mongo 配置,以便作为副本集工作 - 就像一个魅力。

    关于php - 在 PHP 5.2.x 中使用 Docker 环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63040892/

    相关文章:

    php - MySQL 按较大 ID 排序

    python - 将环境变量从 Shippable 传递到 Docker

    macos - 如何使用 mac os x leopard 将目录添加到 $PATH 变量

    php - 让用户呈现自己的 SVG 文件的安全隐患

    php - 如何找出函数内变量的名称?

    c# - 在容器 dotnet 核心容器中运行时无法加载文件或程序集 'Newtonsoft.Json,版本 = 12.0.0.0

    Docker:无法访问服务器

    python - 如何清楚地卸载 django-watson 库

    mysql - 有没有好的wordpress + php-fpm + nginx + mysql 内存优化技巧?

    linux - 定义的 Linux 发行版的哪些命令在 Docker 容器中可用?