从 dockerfile 中入口点脚本的输出设置环境变量

问题描述 投票:0回答:1

我正在尝试从库中获取一些键值对,并将它们以环境变量的形式传递到 kubernetes 容器。

我有一个 Dockerfile,它调用入口点 shell 脚本并 Dockerfile:

COPY --from=stage /app/node_modules ./node_modules
COPY --from=stage /app/package.json ./package.json
COPY --from=builder /app/.env.production ./



EXPOSE 5555


ENTRYPOINT ["/app/scripts/script.sh"]
ENV val=${val}

RUN echo ${val}
CMD [ "npm","start" ]

script.sh 正在从保管库建立连接并获取机密值

#!/bin/bash

    echo "retrive variables from vault "
    export val=$(getParameter "val" "${VAULT_URL}/${xxx}/${ENVIRONMENT}/${dddd}/val")
    echo ${val}

script.sh 的输出返回命令的值(echo ${val}),因此脚本似乎运行良好

但是 dockerfile 将 echo 命令( RUN echo ${val} )的输出返回为 null 并且不将其设置为环境变量

任何人都可以在这里帮忙,我们如何将 script.sh 的输出设置为 env 变量的 ENTRYPOINT。

docker kubernetes containers azure-aks
1个回答
0
投票

Dockerfile

ENTRYPOINT
CMD
指令实际上并不运行这些命令;他们只是在容器实际运行时将这些记录为映像中的数据。虽然它们经常出现在 Dockerfile 的末尾(从逻辑上讲,它们在执行 Dockerfile 中的其他所有内容之后“发生”),但没有特殊原因需要它们。但提前放置它们并不会导致它们实际运行。

如果您只是想获取 Node 应用程序运行时可用的秘密值,则应该在入口点包装器脚本的末尾添加一行

exec "$@"

当 Docker 最终运行容器时,

CMD
作为参数传递给
ENTRYPOINT
。此行导致入口点脚本用它传递的参数 (
exec
) 替换自身 (
"$@"
);也就是说,切换到
CMD
作为主容器命令。

如果您在构建过程中确实需要它,则很难获得保存在环境变量中的命令的结果(并且凭据可能取决于当前用户,并且您不希望它们以纯文本形式保存在图像中)案件)。不过,没有规则规定您“必须”只能将此脚本用作 Docker 入口点脚本;只要您将命令作为参数传递给它,您就可以根据需要重用它。 RUN /app/scripts/script.sh npm build

© www.soinside.com 2019 - 2024. All rights reserved.