为什么我的Docker容器在启动后没有将控制权返回给终端



我有一个shell脚本,用于导出Env变量。这个脚本调用一个python脚本来从web服务中获取某些值,在运行我的主python脚本之前,我需要存储这些值。

我尝试过使用RUN . /bot/env/setenv.sh,但这似乎无法使env变量在最终容器中可用。我曾尝试将内容放入以调用python jbot.py结束的entrypoint.sh文件中,但容器从未完成其设置(我认为是因为入口点内的脚本是一个连续循环?)

我的entrypoint.sh看起来像这样:

#!/bin/bash
. /jirabot/env/setenv.sh
python jbot.py

setenv.sh只是:

#!/bin/bash
export SLACK_BOT_TOKEN="xoxb-token"
export BOT_ID=`python env/print_bot_id.py ${SLACK_BOT_TOKEN}`

我的完整Dockerfile是:

FROM python:2
COPY jirabot/ /jirabot/
RUN pip install slackclient schedule jira
WORKDIR /jirabot
#CMD [ "python", "jbot.py" ]
ENTRYPOINT [ "/jirabot/entrypoint.sh" ]

当我执行docker run bot时,我可以验证应用程序是否正在运行(机器人程序会适当地响应我的请求)。然而,jbot.py中的所有print()语句都没有出现在输出中——所以我有两个主要问题:

  1. 为什么我的entrypoint.sh只是挂起容器而不返回?我做docker run bot,而且我从未返回对终端的控制。然而,这个机器人似乎启动良好。

  2. 当我打开第二个终端并执行docker logs <container>时,为什么我没有从jbot.py获得任何打印语句?

fwiw,我的jbot.py是一个while True:循环,监视输入。

  1. 您没有将docker容器作为守护进程运行

docker run-d bot

  1. 根据我的经验,在python中未禁用输入缓冲的情况下,打印消息无法进入日志

python-u jbot.py

对于您的第一个问题,您应该查看docker run的文档。很快,您将连接集装箱,因此您将永远不会返回您的码头。为了分离,您需要添加选项-d

启动容器的常用命令是docker run -idt <container>

对于您的第二个问题,这些信息不足以识别问题,抱歉。也许您可以在正确启动容器后重试。

最新更新