[英]Docker environmental variables are not accessible in a PHP web application
索引.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
I made a curl request to my web application, and here the docker environment variable is not accessible by the PHP web application. 這似乎是一項安全功能,我們如何訪問 php web 應用程序中的 docker 環境變量。
$ curl http://0.0.0.0:8000/
HOST is : PORT is :
我猜測更改用戶不會保留您執行的環境變量。
您可以使用env
命令檢查環境中可用的變量。
然而,您的 Dockerfile 有幾件事是非慣用的。
--user uid:gid
標志來簡單地設置容器中用戶的用戶 ID 和組 ID。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
用戶。 例如,您可以通過在docker run
命令中傳遞--user 1000:1000
來更改此設置。
因此,為了解決您的問題,我建議您使用以下 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"]
然后我們得到如下output:
$ curl http://0.0.0.0:8000
HOST is : 0.0.0.0PORT is : 8084
如果您登錄到您的 docker 容器
docker exec -it [容器 ID] bash
並運行
環境
命令,您將看到傳遞的變量在那里。
我不是 PHP 專家,但在本地嘗試相同的練習(沒有 docker),看看你是否能夠通過 getenv 打印出任何 env 變量
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.