php - 在PHP Web应用程序中无法访问Docker环境变量

标签 php docker

index.php:

<?php
$host = getenv('HOST');
$port = getenv('PORT');
echo "HOST is : $host";
echo "PORT is : $port";
?>

Dockerfile:
FROM php:7.4-cli
COPY . /var/www/php  
EXPOSE 8000
RUN adduser rouser
CMD ["su", "-", "rouser", "-c", "cd /var/www/php && php -S 0.0.0.0:8000"]

我为应用程序构建了一个PHP docker镜像。
docker build -t php-web-app:1.0.0 .

运行我的PHP docker容器:
docker run -e HOST='0.0.0.0' \
-e PORT='8084' \
-p 8000:8000 \
php-web-app:1.0.0

我向我的Web应用程序发出了curl请求,并且PHP Web应用程序无法访问docker环境变量。这似乎是一项安全功能,我们应该如何在php Web应用程序中访问docker环境变量。
$ curl http://0.0.0.0:8000/
HOST is : PORT is :

最佳答案

我会猜测,更改用户不会保留执行的环境变量。

您可以使用env命令检查环境中可用的变量。

但是,Dockerfile有一些非惯常的事情。

  • 您不应在docker镜像中创建用户。您可以通过在docker run中设置--user uid:gid标志来简单地在容器中设置用户的userid和groupid。
  • 您不应在Dockerfile中运行诸如adduser之类的交互式命令。除非您可以在单个命令中提供所有参数,否则它可以在无需用户干预的情况下运行。添加用户不是其中之一。您将如何提供密码?

  • 因此,要查看环境,请将CMD行更改为以下内容:
    CMD ["su", "-", "rouser", "-c", "env"]
    

    您将看到它显示以下内容:
    SHELL=/bin/bash
    PWD=/home/rouser
    LOGNAME=rouser
    HOME=/home/rouser
    USER=rouser
    SHLVL=0
    PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
    MAIL=/var/mail/rouser
    _=/usr/bin/env
    

    您设置的环境变量不可用。但是,如果我们将CMD行更改为仅打印env,则会得到另一个输出。
    CMD ["env"]
    

    向我们展示:
    HOSTNAME=be0b41fed51e
    PHP_INI_DIR=/usr/local/etc/php
    PORT=8084
    HOME=/root
    PHP_LDFLAGS=-Wl,-O1 -pie
    PHP_CFLAGS=-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
    PHP_MD5=
    PHP_VERSION=7.4.6
    GPG_KEYS=42670A7FE4D0441C8E4632349E4FDC074A4EF02D 5A52880781F755608BF815FC910DEB46F53EA312
    PHP_CPPFLAGS=-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
    PHP_ASC_URL=https://www.php.net/distributions/php-7.4.6.tar.xz.asc
    PHP_URL=https://www.php.net/distributions/php-7.4.6.tar.xz
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    HOST=0.0.0.0
    PHPIZE_DEPS=autoconf            dpkg-dev           file             g++             gcc             libc-dev            make            pkg-config         re2c
    PWD=/
    PHP_SHA256=d740322f84f63019622b9f369d64ea5ab676547d2bdcf12be77a5a4cffd06832
    

    注意这里的用户不是rouser,而是root用户。您可以通过在--user 1000:1000命令中传递docker run来更改此设置。

    因此,为解决您的问题,我建议您使用以下Dockerfile:
    FROM php:7.4-cli
    COPY . /var/www/php  
    EXPOSE 8000
    # RUN adduser rouser
    # CMD ["su", "-", "rouser", "-c", "cd /var/www/php && php -S 0.0.0.0:8000"]
    
    WORKDIR /var/www/php 
    CMD ["php", "-S", "0.0.0.0:8000"]
    

    然后我们得到以下输出:
    $ curl http://0.0.0.0:8000
    HOST is : 0.0.0.0PORT is : 8084
    

    关于php - 在PHP Web应用程序中无法访问Docker环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62118842/

    相关文章:

    docker - 是否可以将所有现有的env变量传递给镜像,而无需将其声明为indv?

    docker - 在现有奴隶上使用 docker 的 Jenkins 管道

    php - 在mysql数据库中插入 "\"符号?

    php - Mysql 2 select all 语句无法正常工作

    javascript - 与单独的 Chrome 选项卡进行通信

    javascript - 如何在 Javascript/PHP 中选择月份和年份后立即填充月份的天数?

    PHP:删除文件夹(包括其内容)的最简单方法

    docker - Pa11y的最佳Docker实例

    docker - 无法从容器内访问Docker API

    docker - Docker(Spotify)API-无法连接到Docker