设置运行时在shell中从容器派生的环境变量

时间:2020-07-02 05:35:14

标签: bash docker dockerfile docker-exec

我有一个导出环境变量的自定义入口点。环境变量的值是使用运行时提供的其他两个变量构造的。

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的值?这里丢失了什么?

1 个答案:

答案 0 :(得分:1)

环境变量不会在所有bash会话中持续存在。容器运行时,它将仅在该入口点会话中可用,但以后如果使用export进行设置,它将不可用。

docker ENV vs RUN export

如果要在所有会话中使用,则应在Dockerfile中设置它们。

ENV SCHEME=http
ENV HOST=example.com
ENV PORT=3000

在应用程序端,您可以将它们一起使用。它也可用于所有会话。

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,我们可以使用相同的脚本,但行为却有所不同,因此该变量仅在该会话中可用,如果您对以后使用感兴趣,可以将它们写入文件。