我正在使用一个python脚本来发送WebSocket通知,建议使用here。
脚本是_wsdump.py
,我有一个脚本script.sh
,它是:
# !/bin/sh
set -o allexport
. /root/.env set
env
python3 /utils/_wsdump.py "wss://mywebsocketserver:3000/message" -t "message" &
如果我尝试使用Dockerfile
停靠此脚本:
FROM python:3.8-slim-buster
RUN set -xe \
pip install --upgrade pip wheel && \
pip3 install websocket-client
ENV TZ="Europe/Rome"
ADD utils/_wsdump.py /utils/_wsdump.py
ADD .env /root/.env
ADD script.sh /
ENTRYPOINT ["./script.sh"]
CMD []
我有一个奇怪的行为:
- 如果我执行
docker run -it --entrypoint=/bin/bash mycontainer
,然后调用script.sh
,一切都正常,我会收到通知。 - 如果我用
docker run mycontainer
运行mycontainer
,我没有看到错误,但是通知没有到达。
可能是什么原因?
2条答案
按热度按时间0dxa2lsx1#
您的脚本不会启动长时间运行的进程;它试图在后台启动一些东西,然后完成。由于脚本完成,并且它是容器的
ENTRYPOINT
,容器也退出。简单的修复方法是从脚本的最后一行的末尾删除
&
,以使Python进程在前台运行,并且容器将保持活动状态,直到进程完成。这里我推荐采用一种更通用的入口点 Package 器脚本模式。如果您查看您的脚本,它会做两件事:(1)设置环境,然后(2)运行实际的主容器命令。
您可以使用魔术行
exec "$@"
来结束入口点脚本,以将CMD
作为实际的主容器进程运行。(从技术上讲,它用通过重放命令行参数构造的命令替换当前的shell脚本;在Docker上下文中,CMD
作为参数传递给ENTRYPOINT
。)通过这种用法,您可以通过替换命令部分(仅限)来调试容器设置,如
以打印出其环境。替代命令
env
将替换停靠文件CMD
,但ENTRYPOINT
将保留在原处。f87krz0w2#
您将
script.sh
安装到根目录/
,但您的ENTRYPOINT
被定义为运行相对路径./script.sh
。请尝试将
ENTRYPOINT
改为引用绝对路径/script.sh
。