如何设置环境变量以便它们在非交互式 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_HOME
,gradlew
失败。
我的解决方法是将交互标志 -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
命令的作用相同。
我运行直接从 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_HOME
,gradlew
失败。
我的解决方法是将交互标志 -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
命令的作用相同。