我有这样的dockerfile
ENTRYPOINT ["bash", "-c", "/opt/app/wait-for-it-and-start.sh"]
默认情况下不带参数,它不等待任何东西,它启动我的应用程序。
现在从docker-compose.yaml文件中,我想从环境部分添加参数,例如。
environment:
- MONGO_HOST=mongodb
- MONGO_PORT=27017
command: ["$$MONGO_HOST:$$MONGO_PORT"]
问题在于,在docker-compose up --build之后,wait-for-it-and-start.sh没有收到参数。
有人可以解释我为什么吗?我怎么能成功?
答案 0 :(得分:0)
您可以在docker-compose.yml中传递args,用需要添加的参数重写入口点,如下所示:
version: '3'
services:
myService:
entrypoint:
- /opt/app/wait-for-it-and-start.sh
- mongodb
- 27017
答案 1 :(得分:0)
当您同时具有入口点和命令(无论它们来自Dockerfile
,docker-compose.yml
还是docker run
参数)时,它们就会合并为一个命令行。就您而言,这会运行(添加引号)
bash -c "/opt/app/wait-for-it-and-start.sh" "$$MONGO_HOST:$$MONGO_PORT"
如果您查看the bash manual,则要评估的文本之后的第一个参数将被当作隐式的$0
参数,该参数通常包含脚本的名称,这就是为什么它在这里被吞噬了。 / p>
最简单的机械更改是仅除去sh -c
包装纸。 (除非您需要重定向或命令链接之类的东西,否则几乎不需要它,如果需要, eg CMD
的纯字符串形式将为您插入。)>
ENTRYPOINT ["/opt/app/wait-for-it-and-start.sh"]
我怀疑您在这里依靠shell来扩展环境变量。通过此序列很难做到这一点(实际上,没有地方可以插入有效的sh -c
包装器)。直接在脚本中直接使用环境变量比尝试将其作为位置参数读回要容易。例如
#!/bin/sh
wait-for-it.sh "$MONGO_HOST:$MONGO_PORT"
exec "$@"
带有相应的Dockerfile
...
ENTRYPOINT ["/opt/app/wait-for-it-and-start.sh"]
CMD ["/opt/app/myapp"]