在 shell 内设置运行时在容器中派生的环境变量
Setting environment variable derived in container at runtime within a shell
我有一个导出环境变量的自定义入口点。环境变量的值是使用运行时提供的另外两个变量构造的。
来自 Dockerfile 的片段 CMD ["bash", "/opt/softwareag/laas-api-server/entrypoint.sh"]
。
来自 entrypoint.sh
的片段
export URL="$SCHEME://$HOST:$PORT"
echo "URL:$URL"
命令 docker run -e HOST="localhost" -e PORT="443" mycentos
按预期打印 URL:localhost:443 但当执行以下命令时,相同的变量似乎已丢失值。
docker exec -ti <that-running-container-from-myimage> bash
container-prompt> echo $URL
<empty-line>
为什么导出的变量似乎丢失了 URL 的值?这里丢失了什么?
环境变量不会在所有 bash 会话中持续存在。当容器 运行 时,它将仅在该入口点会话中可用,但如果使用 export
.
设置,则稍后它将不可用
如果你想在所有会话中使用,你应该在 Dockerfile 中设置它们。
ENV SCHEME=http
ENV HOST=example.com
ENV PORT=3000
并且在应用程序方面,您可以使用它们together.also它将对所有会话可用。
curl "${SCHEME}://${HOST}:${PORT}
#
Step 8/9 : RUN echo "${SCHEME}://${HOST}:${PORT}"
---> Running in afab41115019
http://example.com:3000
现在,如果我们调查您使用的方式,它不会起作用,因为
export URL="$SCHEME://$HOST:$PORT"
# only in this session
echo "URL:$URL"
# will be available for node process too but for this session only
node app.js
例如查看这个 Dockerfile
FROM node:alpine
RUN echo $'#!/bin/sh \n\
export URL=example.com \n\
echo "${URL}" \n\
node -e \'console.log("ENV URL value inside nodejs", process.env.URL)\' \n\
exec "$@" \n\
' >> /bin/entrypoint.sh
RUN chmod +x /bin/entrypoint.sh
entrypoint ["entrypoint.sh"]
因此,当您第一次 运行 docker 容器时,您将能够看到预期的响应。
docker run -it --rm myapp
example.com
ENV URL value inside nodejs example.com
现在我们要检查以后的会话。
docker run -it --rm abc tail -f /dev/null
example.com
ENV URL value inside nodejs example.com
因此容器在这段时间内启动,我们可以验证另一个会话
docker exec -it myapp sh -c "node -e 'console.log(\"ENV URL value inside nodejs\", process.env.URL)'"
ENV URL value inside nodejs undefined
由于docker,我们可以使用相同的脚本但行为不同,因此该变量仅在该会话中可用,如果您有兴趣以后使用,可以将它们写入文件。
我有一个导出环境变量的自定义入口点。环境变量的值是使用运行时提供的另外两个变量构造的。
来自 Dockerfile 的片段 CMD ["bash", "/opt/softwareag/laas-api-server/entrypoint.sh"]
。
来自 entrypoint.sh
export URL="$SCHEME://$HOST:$PORT"
echo "URL:$URL"
命令 docker run -e HOST="localhost" -e PORT="443" mycentos
按预期打印 URL:localhost:443 但当执行以下命令时,相同的变量似乎已丢失值。
docker exec -ti <that-running-container-from-myimage> bash
container-prompt> echo $URL
<empty-line>
为什么导出的变量似乎丢失了 URL 的值?这里丢失了什么?
环境变量不会在所有 bash 会话中持续存在。当容器 运行 时,它将仅在该入口点会话中可用,但如果使用 export
.
如果你想在所有会话中使用,你应该在 Dockerfile 中设置它们。
ENV SCHEME=http
ENV HOST=example.com
ENV PORT=3000
并且在应用程序方面,您可以使用它们together.also它将对所有会话可用。
curl "${SCHEME}://${HOST}:${PORT}
#
Step 8/9 : RUN echo "${SCHEME}://${HOST}:${PORT}"
---> Running in afab41115019
http://example.com:3000
现在,如果我们调查您使用的方式,它不会起作用,因为
export URL="$SCHEME://$HOST:$PORT"
# only in this session
echo "URL:$URL"
# will be available for node process too but for this session only
node app.js
例如查看这个 Dockerfile
FROM node:alpine
RUN echo $'#!/bin/sh \n\
export URL=example.com \n\
echo "${URL}" \n\
node -e \'console.log("ENV URL value inside nodejs", process.env.URL)\' \n\
exec "$@" \n\
' >> /bin/entrypoint.sh
RUN chmod +x /bin/entrypoint.sh
entrypoint ["entrypoint.sh"]
因此,当您第一次 运行 docker 容器时,您将能够看到预期的响应。
docker run -it --rm myapp
example.com
ENV URL value inside nodejs example.com
现在我们要检查以后的会话。
docker run -it --rm abc tail -f /dev/null
example.com
ENV URL value inside nodejs example.com
因此容器在这段时间内启动,我们可以验证另一个会话
docker exec -it myapp sh -c "node -e 'console.log(\"ENV URL value inside nodejs\", process.env.URL)'"
ENV URL value inside nodejs undefined
由于docker,我们可以使用相同的脚本但行为不同,因此该变量仅在该会话中可用,如果您有兴趣以后使用,可以将它们写入文件。