英文:
How to read enviroment variables in dockerfile correctly
问题
我有一个Dockerfile,我正在尝试读取运行时参数。以下是我的Dockerfile:
FROM clojure:openjdk-8-lein-slim-buster
ENV dbconfig ""
ENTRYPOINT ["java","-Ddbconfig=${dbconfig}", "-jar", "abc.jar", "server"]
EXPOSE 8080
这是Docker运行命令,我正在其中传递运行时值。我在这里做错了吗?值始终被识别为空。我还尝试过删除`ENV dbconfig ""`,但没有效果:
docker run --rm -e dbconfig='{"somekey" "value"}' xyz/abc
英文:
I have a Dockerfile where i am trying to read runtime args. Here is my dockerfile
FROM clojure:openjdk-8-lein-slim-buster
ENV dbconfig ""
ENTRYPOINT ["java","-Ddbconfig=${dbconfig}", "-jar", "abc.jar", "server"]
EXPOSE 8080
And here is the docker run command where i am passing values at runtime. Am i doing something wrong here? Values are always recognized as null. I have also tried removing ENV dbconfig ""
but nothing works
docker run --rm -e dbconfig='{"somekey" "value"}' xyz/abc
答案1
得分: 1
你有两种方式来定义入口点:exec vs shell。
exec形式被解析为JSON数组,这意味着你必须使用双引号(")而不是单引号(')。
所以你使用exec
形式。
但是:
与shell形式不同,exec形式不会调用命令shell。
这意味着不会发生正常的shell处理。例如,
ENTRYPOINT [ "echo", "$HOME" ] 不会对$HOME进行变量替换。
因此,为了允许环境变量替换,更倾向于使用shell形式:
ENTRYPOINT java -Ddbconfig=${dbconfig} -jar abc.jar server
或在exec形式中调用一个shell:
ENTRYPOINT [ "sh", "-c", "java", "-Ddbconfig=${dbconfig}", "-jar", "abc.jar", "server" ]
英文:
You have two ways to define entrypoint : exec vs shell.
> The exec form is parsed as a JSON array, which means that you must use
> double-quotes (“) around words not single-quotes (‘).
So you use the exec
form.
But :
> Unlike the shell form, the exec form does not invoke a command shell.
> This means that normal shell processing does not happen. For example,
> ENTRYPOINT [ "echo", "$HOME" ] will not do variable substitution on
> $HOME
So favor the shell form to allow env variable substitutions :
ENTRYPOINT java -Ddbconfig=${dbconfig} -jar abc.jar server
or invoke a shell in the exec form :
ENTRYPOINT [ "sh", "-c", "java","-Ddbconfig=${dbconfig}", "-jar", "abc.jar", "server" ]
答案2
得分: -1
尝试使用CMD来传递运行时参数,示例如下:
ENTRYPOINT ["/bin/bash"]
CMD ["/sample.sh", "argument1", "argument2"]
然后在运行时传递参数的方式是:
docker run -i -t argument1 argument2
英文:
Try using CMD to pass runtime arguments, sample like below
ENTRYPOINT ["/bin/bash"]
CMD ["/sample.sh", "argument1","argument2"]
Then passing arguments at runtime would be:-
docker run -i -t argument1 argument2
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论