我有一个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()
语句都没有出现在输出中——所以我有两个主要问题:
为什么我的
entrypoint.sh
只是挂起容器而不返回?我做docker run bot
,而且我从未返回对终端的控制。然而,这个机器人似乎启动良好。当我打开第二个终端并执行
docker logs <container>
时,为什么我没有从jbot.py
获得任何打印语句?
fwiw,我的jbot.py
是一个while True:
循环,监视输入。
- 您没有将docker容器作为守护进程运行
docker run-d bot
- 根据我的经验,在python中未禁用输入缓冲的情况下,打印消息无法进入日志
python-u jbot.py
对于您的第一个问题,您应该查看docker run
的文档。很快,您将连接集装箱,因此您将永远不会返回您的码头。为了分离,您需要添加选项-d
。
启动容器的常用命令是docker run -idt <container>
。
对于您的第二个问题,这些信息不足以识别问题,抱歉。也许您可以在正确启动容器后重试。