Psy*_*nch 85 docker dockerfile
如果我设置一个环境变量,比方说ENV ADDRESSEE=world
,我想在入口点脚本中使用它连接成一个固定的字符串,如:
ENTRYPOINT ["./greeting", "--message", "Hello, world!"]
Run Code Online (Sandbox Code Playgroud)
与world
作为环境varible的价值,我该怎么办呢?我试过使用,"Hello, $ADDRESSEE"
但似乎没有用,因为它需要$ADDRESSEE
字面意思.
vit*_*itr 168
你正在使用ENTRYPOINT 的exec形式.与shell表单不同,exec表单不会调用命令shell.这意味着不会发生正常的shell处理.例如,ENTRYPOINT [ "echo", "$HOME" ]
不会对$ HOME进行变量替换.如果你想要shell处理,那么要么使用shell表单,要么直接执行shell,例如:ENTRYPOINT [ "sh", "-c", "echo $HOME" ]
.
当使用exec表单并直接执行shell时,就像shell表单的情况一样,它是执行环境变量扩展的shell,而不是docker.(来自Dockerfile引用)
在你的情况下,我会使用shell形式
ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\!"
Run Code Online (Sandbox Code Playgroud)
mlo*_*o55 16
在经历了很多痛苦以及@vitr 等人的大力帮助之后,我决定尝试
这奏效了。
ENV LISTEN_PORT=""
ENTRYPOINT java -cp "app:app/lib/*" hello.Application --server.port=${LISTEN_PORT:-80}
Run Code Online (Sandbox Code Playgroud)
例如
docker run --rm -p 8080:8080 -d --env LISTEN_PORT=8080 my-image
Run Code Online (Sandbox Code Playgroud)
和
docker run --rm -p 8080:80 -d my-image
Run Code Online (Sandbox Code Playgroud)
两者都在我的容器中正确设置了端口
见https://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.html
sma*_*c89 15
对我来说,我想将脚本的名称存储在变量中,并仍然使用 exec 形式。
注意:确保您尝试使用的变量已从命令行或通过指令声明为环境变量ENV
。
最初我做了类似的事情:
ENTRYPOINT [ "${BASE_FOLDER}/scripts/entrypoint.sh" ]
Run Code Online (Sandbox Code Playgroud)
但显然这不起作用,因为我们使用的是shell形式,并且列出的第一个程序需要是PATH
. 所以为了解决这个问题,这就是我最终要做的:
ENTRYPOINT [ "/bin/bash", "-c", "exec ${BASE_FOLDER}/scripts/entrypoint.sh \"${@}\"", "--" ]
Run Code Online (Sandbox Code Playgroud)
注意需要双引号
这样做的目的是允许我们获取传递给 的任何额外参数/bin/bash
,并在 bash 解析名称后将这些相同的参数提供给我们的脚本。
--
A -- 表示选项结束并禁用进一步的选项处理。-- 之后的任何参数都被视为文件名和参数。- 的参数相当于 --。
PS--
还可以与任何兼容 POSIX 的 shell 配合使用。请参阅实用程序语法指南
Tal*_*ues 14
重要提示:您希望在 中使用的变量
ENTRYPOINT
必须是ENV
类型(而不是ARG
类型)。
ARG APP_NAME=app.jar # $APP_NAME can be ARG or ENV type.
ENV APP_PATH=app-directory/$APP_NAME # $APP_PATH must be ENV type.
ENTRYPOINT java -jar $APP_PATH
Run Code Online (Sandbox Code Playgroud)
执行以下命令将导致:
java -jar app-directory/app.jar
ARG ADDRESSEE="world" # $ADDRESSEE can be ARG or ENV type.
ENV MESSAGE="Hello, $ADDRESSEE!" # $MESSAGE must be ENV type.
ENTRYPOINT ./greeting --message $MESSAGE
Run Code Online (Sandbox Code Playgroud)
执行以下命令将导致:
./greeting --message Hello, world!
""
我的提示:只要有可能,就使用
ENV
而不是ARG
避免你或一方的混乱SHELL
。
我尝试解决建议的答案,但仍然遇到了一些问题...
这是解决我的问题的方法:
ARG APP_EXE="AppName.exe"
ENV _EXE=${APP_EXE}
# Build a shell script because the ENTRYPOINT command doesn't like using ENV
RUN echo "#!/bin/bash \n mono ${_EXE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh
# Run the generated shell script.
ENTRYPOINT ["./entrypoint.sh"]
具体针对您的问题:
RUN echo "#!/bin/bash \n ./greeting --message ${ADDRESSEE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
归档时间: |
|
查看次数: |
58463 次 |
最近记录: |