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

时间:2017-10-13 03:17:44

标签: python bash shell docker dockerfile

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

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

我的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时,我可以验证应用程序是否正在运行(机器人会正确响应我的请求)。但是,print()中的所有jbot.py语句都不在输出中 - 所以我有两个主要问题:

  1. 为什么我的entrypoint.sh只是挂起容器而不是返回?我做docker run bot,我永远不会回到终端的控制权。然而,机器人似乎启动良好。

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

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

2 个答案:

答案 0 :(得分:3)

  1. 您没有运行泊坞窗容器as a daemon
  2.   

    docker run -d bot

    1. 根据我的经验,在python中禁用输入缓冲时,打印消息不会进入日志。
    2.   

      python -u jbot.py

答案 1 :(得分:1)

关于第一个问题,您应该查看docker run的文档。很快,您附加容器,所以您永远不会返回您的终端。要分离,您需要添加选项-d

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

对于你的第二个问题,这些信息不足以确定问题,对不起。也许您可以在正确启动容器后再试一次。