首页 > 解决方案 > Docker 环境变量在 PHP Web 应用程序中不可访问

问题描述

索引.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 :

标签: phpdocker

解决方案


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

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

然而,你的 Dockerfile 有几件事是非惯用的。

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

因此,要查看环境,请将您的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

推荐阅读