【问题标题】:Env var is defined on docker but returns NoneEnv var 在 docker 上定义但返回 None
【发布时间】:2021-03-08 17:37:11
【问题描述】:

我正在处理我使用 firesh/nginx-lua 创建的 docker 映像(Linux 发行版是 Alpine):

FROM firesh/nginx-lua

COPY ./nginx.conf /etc/nginx
COPY ./handler.lua /etc/nginx/
COPY ./env_var_echo.py /etc/nginx/

RUN apk update
RUN apk add python3
RUN nginx -s reload

我运行镜像,然后进入docker:

docker run -it -d -p 8080:80 --name my-ngx-lua nginx-lua
docker exec -it my-ngx-lua sh

然后我在 docker 内部定义一个新的环境变量

/etc/nginx # export SECRET=thisIsMySecret
/etc/nginx # echo $SECRET
thisIsMySecret
/etc/nginx #

编辑:定义新的环境变量后,我退出容器,然后再次进入它,它不再存在:

/etc/nginx # exit
iy@MacBook-Pro ~ % docker exec -it my-ngx-lua sh
/etc/nginx # echo $SECRET

/etc/nginx #

我运行 python 脚本,我希望收到“thisIsMySecret”,这是我定义的值。

import os

secret_key = os.environ.get('SECRET')
print(secret_key + '\n')

但我得到的是 None

只有当我使用 docker(例如 PATH)调用 已经来 的任何环境变量时,python 才会返回它的值。但如果它是我刚刚定义的 env var,它将返回 None。

顺便说一句,我对 lua 进行了同样的尝试并收到 nil。因此我很确定问题来自 Alpine。

不是在寻找像从 docker build 定义环境变量这样的解决方案。

谢谢。

【问题讨论】:

  • 您显示的交互式 shell 会话与脚本有何关系?你能提供 Dockerfile 和其他指令来运行容器吗?您通常希望如何设置环境变量?
  • @DavidMaze 我运行了一个 docker,定义了一个新的环境变量并从 python 调用它。 Dockerfile 将如何贡献?无论如何,这是图像:hub.docker.com/r/firesh/nginx-lua
  • 如果您只是使用预构建的映像,我对脚本如何进入容器有点困惑。我通常也希望该图像运行 Nginx 而不是交互式 shell。您能否编辑问题以提供您正在运行的 exact 命令,尤其是 docker run 命令?
  • 我运行了 docker,定义了一个新的环境变量并从 python 调用它。它奏效了:pastebin.com/aByMyGZB 请添加更多详细信息。
  • 如果您docker run 提供的图像,它运行 Nginx,而不是交互式 shell。您所显示的任何内容都无法表明您是如何运行 Python 脚本的。仅基于您所展示的内容,我建议您启动您的映像 FROM python:3.9 而不是不相关的 Nginx 映像,并在 Dockerfile 中设置 ENV;如果您澄清这三个部分是如何结合在一起的,以及为什么 ENV 不是一个好的答案,将会有所帮助。

标签: python docker nginx lua alpine


【解决方案1】:

这个

定义新的环境变量后,我退出容器

是原因。导出变量仅在主进程存在时存在,并且仅对声明它的进程可见。

您需要在启动容器时使用-e 选项:

docker run -e SECRET=mysecret ...

使用此 docker 会将环境变量添加到主进程(在本例中为 NGINX)以及docker exec 命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2018-01-04
    • 2020-07-11
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 2018-08-14
    相关资源
    最近更新 更多