docker编写环境变量作用域问题:命令在容器内部和外部的行为不相同



我在通过"服务->命令";而不是在容器的CLI中使用它们。

这是一个伪docker-compose.yml

version: "3"
services:
service:
restart: unless-stopped
build:
context: .
dockerfile: Dockerfile
volumes:
- ./config:/config
command: "printenv"
environment:
- REDIS_HOST=some.host

如果我用docker-compose up --build运行上面的命令,那么作为环境变量的printenv命令的结果,我会得到以下输出:

service_1  | SHLVL=1
service_1  | OLDPWD=/
service_1  | PATH=/command:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
service_1  | PWD=/app/src

但是,如果我删除服务描述中的command键,并进入容器cli并运行$ printenv

我得到:

SHLVL=1
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
REDIS_HOST=some.host
PWD=/app/src

正如你所看到的,两者之间存在着矛盾。

我的"真实的";目标是在Python脚本中使用这个ENV变量(它们也没有看到ENV变量(,所以将实际的var值输入printenv结果是目标,而不是真正的";打印";值。

编辑:

根据请求,伪Dockerfile是这样的:

FROM lsiobase/rdesktop-web:alpine AS base
FROM base AS service
CMD printenv

我相信这与lsiobase的形象有关,而不是其他任何东西。如果我将图像更改为类似FROM python:3.9-slim-bullseye AS base的东西,大多数事情都可以,但我不能添加Libreoffice,这是一切开始的根本需求。


我希望这是清楚的,感谢您的帮助。

谨致问候,拉法。

进入容器cli并运行$printenv

是的,当您"进入容器cli";,你真正要做的是执行一个shell,在这个shell中你输入printenv,这使得这个shell执行一个程序printenv,不管shell决定环境应该是什么。这个shell决定将HOME变量添加到程序的环境中。壳

请注意,交互式shell和非交互式shell在启动文件中存在差异。典型的https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html。如果您想获取登录交互启动文件,请自己获取command: bash -lc '. ~/.bashrc && printfenv'或类似文件。

相关内容

  • 没有找到相关文章