如何设置环境变量以便它们在非交互式 bash shell 中工作?

How to set environment variables so they work in non-interactive bash shells?

我运行直接从 dockerhub 下载 amazonlinux:2 docker 图像,并使用以下命令安装 corretto-17 JDK:

yum install -y git java-17-amazon-corretto-devel

注意:我没有使用自定义 Dockerfile,我无法控制它,也无法更改它。

然后当我尝试 运行 我的 .gradlew 任务时,它失败了,因为没有设置 JAVA_HOME。 所以我这样做:

echo "export JAVA_HOME='/usr/lib/jvm/java-17-amazon-corretto.x86_64'" >> /root/.bashrc

如果我手动将终端连接到容器,.bashrc 工作正常,gradlew 将 运行。

但是当我 运行 从容器外部通过类似的命令发出命令时:

docker exec kopibuild /bin/bash -c "cd the-project-code && ./gradlew build"

未加载 .bashrc,因此未设置 JAVA_HOMEgradlew 失败。

我的解决方法是将交互标志 -i 添加到 bash 命令,然后一切正常,但日志中有关于“无法设置终端进程组 (-1)”的警告: 设备的 ioctl 不合适。

docker exec kopibuild /bin/bash -c "cd the-project-code && BASH_ENV=/root/.bashrc ./gradlew build"

但它似乎没有做任何事情。

为 Amazon Linux 设置环境变量的正确方法是什么,以便它们将存在于非交互式 shell 调用中?

在 Google 上仔细研究后 - 我相信没有标准的 Linux 方法来为 non-interactive 设置环境变量 炮弹。

但是有一种Docker的方式来回答这个问题。在来自 amazonlinux:2 图像的容器的原始 docker create 上,通过 -e JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto.x86_64 指定环境变量。这将环境变量存储在容器的 docker 元数据中,它将在所有执行上下文中可用,包括通过 docker exec 直接调用的 non-interactive shell(无需为每个执行明确指定) exec 命令)。

据我所知,这与 Dockerfile 中的 ENV 命令的作用相同。