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有一些非惯常的事情。
--user uid:gid
标志来简单地在容器中设置用户的userid和groupid。 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/