簡體   English   中英

Docker 環境變量在 PHP web 應用程序中不可訪問

[英]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 有幾件事是非慣用的。

  1. 您不應在 docker 映像中創建用戶。 您可以通過在 docker 運行中設置--user uid:gid標志來簡單地設置容器中用戶的用戶 ID 和組 ID。
  2. 您不應在 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用戶。 例如,您可以通過在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM