我正在使用一个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" &

如果我try 将此脚本停靠在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,我看不到任何错误,但没有收到通知.

可能的原因是什么?

推荐答案

您的脚本不会启动一个长时间运行的进程;它会try 在后台启动一些东西,然后完成.由于脚本完成,并且是容器的ENTRYPOINT,所以容器也退出.

简单的解决方法是从脚本最后一行的末尾删除&,以使Python进程在前台运行,并且容器将保持活动状态,直到进程完成.


在这里,我推荐采用入口点包装器脚本的更通用模式.如果您查看您的脚本,它会做两件事:(1)设置环境,然后(2)运行实际的主容器命令.我建议使用Docker CMD来执行实际命令

# 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将替换DockerFileCMD,但ENTRYPOINT将保持不变.

Python相关问答推荐

Pandas read_jsonfuture 警告:解析字符串时,to_datetime与单位的行为已被反对

如何匹配3D圆柱体的轴和半径?

如何在超时的情况下同步运行Matplolib服务器端?该过程随机挂起

将numpy矩阵映射到字符串矩阵

过滤绕轴旋转的螺旋桨

更改Seaborn条形图中的x轴日期时间限制

Odoo -无法比较使用@api.depends设置计算字段的日期

当密钥是复合且唯一时,Pandas合并抱怨标签不唯一

Python 3.12中的通用[T]类方法隐式类型检索

使用SciPy进行曲线匹配未能给出正确的匹配

根据条件将新值添加到下面的行或下面新创建的行中

如何让剧作家等待Python中出现特定cookie(然后返回它)?

使用索引列表列表对列进行切片并获取行方向的向量长度

Julia CSV for Python中的等效性Pandas index_col参数

如何从数据库上传数据到html?

在输入行运行时停止代码

合并与拼接并举

人口全部乱序 - Python—Matplotlib—映射

在Python中从嵌套的for循环中获取插值

如何在Python请求中组合多个适配器?