我在通过"服务->命令";而不是在容器的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'
或类似文件。