websocket 为什么一个dockerized脚本在我docker运行或我docker执行它时有不同的行为?

t1qtbnec  于 2022-11-11  发布在  Docker
关注(0)|答案(2)|浏览(109)

我正在使用一个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,我没有看到错误,但是通知没有到达。

可能是什么原因?

0dxa2lsx

0dxa2lsx1#

您的脚本不会启动长时间运行的进程;它试图在后台启动一些东西,然后完成。由于脚本完成,并且它是容器的ENTRYPOINT,容器也退出。
简单的修复方法是从脚本的最后一行的末尾删除&,以使Python进程在前台运行,并且容器将保持活动状态,直到进程完成。
这里我推荐采用一种更通用的入口点 Package 器脚本模式。如果您查看您的脚本,它会做两件事:(1)设置环境,然后(2)运行实际的主容器命令。


# end of Dockerfile

ENTRYPOINT ["./script.sh"]
CMD python3 /utils/_wsdump.py "wss://mywebsocketserver:3000/message" -t "message"

您可以使用魔术行exec "$@"来结束入口点脚本,以将CMD作为实际的主容器进程运行。(从技术上讲,它用通过重放命令行参数构造的命令替换当前的shell脚本;在Docker上下文中,CMD作为参数传递给ENTRYPOINT。)


# !/bin/sh

# script.sh

# set up the environment

. /root/.env set

# run the main container command

exec "$@"

通过这种用法,您可以通过替换命令部分(仅限)来调试容器设置,如

docker run --rm your-image env

以打印出其环境。替代命令env将替换停靠文件CMD,但ENTRYPOINT将保留在原处。

f87krz0w

f87krz0w2#

您将script.sh安装到根目录/,但您的ENTRYPOINT被定义为运行相对路径./script.sh
请尝试将ENTRYPOINT改为引用绝对路径/script.sh

相关问题