Answers:
您正在使用ENTRYPOINT 的exec形式。与shell表单不同,exec表单不会调用命令shell。这意味着正常的外壳处理不会发生。例如,ENTRYPOINT [ "echo", "$HOME" ]
将不会在$ HOME上进行变量替换。如果要进行shell处理,则可以使用shell形式或直接执行shell,例如:ENTRYPOINT [ "sh", "-c", "echo $HOME" ]
。
当使用exec表单并直接执行shell时(例如在shell表单中),是由shell进行环境变量扩展,而不是docker。(来自Dockerfile参考)
在你的情况下,我会使用外壳形式
ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\!"
--attitude "shouting"
在该docker run
命令中添加参数,而该参数应传递给./greeting
ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\! $0 $@"
,如果你也想通过额外的变量./greeting
通过docker run
调用(或传递CMD
的Dockerfile的)
greeting
在您的示例中)。hynek.me/articles/docker-signals
我尝试解决建议的答案,但仍然遇到了一些问题...
这是我的问题的解决方案:
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"]
经过许多痛苦和@vitr等人的大力协助,我决定尝试
而且有效。
ENV LISTEN_PORT=""
ENTRYPOINT java -cp "app:app/lib/*" hello.Application --server.port=${LISTEN_PORT:-80}
例如
docker run --rm -p 8080:8080 -d --env LISTEN_PORT=8080 my-image
和
docker run --rm -p 8080:80 -d my-image
都在我的容器中正确设置了端口
参见https://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.html
ENTRYPOINT java -jar /dockertest.jar -Djava.security.egd=file:/dev/./urandom -Dserver.port=$port
一会儿ENV port=123
。ENV端口未解析。有什么想法吗?