我尝试在buildbot start
ENTRYPOINT/CMD
条指令中撰写运行Dockerfile
的最简单的docker buildbot主映像。
我尝试过使用dumb-init
,gosu
和exec
的大量组合,但没有成功。
情况如下:
当我尝试使用命令docker run -d -v $local/vol/bldbot/master:/var/lib/buildbot buildbot-master-test
运行deamonized buildroot时,容器成功启动,但它突然终止。日志如下所示:
[timestamp] [ - ]日志打开。
[timestamp] [ - ] twistd 16.0.0(/ usr / bin / python 2.7.12)启动。
[timestamp] [ - ] reactor class:twisted.internet.epollreactor.EPollReactor。
[timestamp] [ - ]启动BuildMaster - buildbot.version:0.9.2
[timestamp] [ - ]从' /var/lib/buildbot/master.cfg'加载配置;
[timestamp] [ - ]使用URL' sqlite:/state.sqlite'设置数据库;
[timestamp] [ - ]将数据库日记帐模式设置为' wal'
[时间戳] [ - ]为主人做家务1 c8aa8b0d5ca3:/ var / lib / buildbot
[timestamp] [ - ]添加1个新的changeources,删除0
[timestamp] [ - ]添加1个新构建器,删除0
[timestamp] [ - ]添加2个新调度程序,删除0
[timestamp] [ - ]此主站上没有配置Web服务器
[时间戳] [ - ]添加1个新工人,删除0
[timestamp] [ - ] PBServerFactory起始于9989年
[时间戳] [ - ]启动工厂
[timestamp] [ - ] BuildMaster正在运行
当我使用命令docker run --rm -it -v $local/vol/bldbot/master:/var/lib/buildbot buildbot-master-test /bin/sh
以交互模式运行容器时,接下来我运行命令buildbot start
就像魅力一样。
我已经研究过官方buildbot主泊坞窗映像的内容,即buildbot/buildbot-master
。我看到作者决定在start_buildbot.sh中使用exec twistd -ny $B/buildbot.tac
命令,而不是他们自己的buildbot start
。
所以问题是,如何在仅仅ENTRYPOINT/CMD
运行的Dockerfile中编写buildbot start
指令。
Dockerfile
内容
FROM alpine:3.4
ENV BASE_DIR=/var/lib/buildbot SRC_DIR=/usr/src/buildbot
COPY start $SRC_DIR/
RUN \
echo @testing http://nl.alpinelinux.org/alpine/edge/testing >> /etc/apk/repositories && \
echo @community http://nl.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories && \
apk add --no-cache \
python \
py-pip \
py-twisted \
py-cffi \
py-cryptography@community \
py-service_identity@community \
py-sqlalchemy@community \
gosu@testing \
dumb-init@community \
py-jinja2 \
tar \
curl && \
# install pip dependencies
pip install --upgrade pip setuptools && \
pip install "buildbot" && \
rm -r /root/.cache
WORKDIR $BASE_DIR
RUN \
adduser -D -s /bin/sh bldbotmaster && \
chown bldbotmaster:bldbotmaster .
VOLUME $BASE_DIR
CMD ["dumb-init", "/usr/src/buildbot/start","buildbot","master"]
start
脚本内容
#!/bin/sh
set -e
BASE_DIR=/var/lib/buildbot
if [[ "$1" = 'buildbot' && "$2" = 'master' ]]; then
if [ -z "$(ls -A "$BASE_DIR/master.cfg" 2> /dev/null)" ]; then
gosu bldbotmaster buildbot create-master -r $BASE_DIR
gosu bldbotmaster cp $BASE_DIR/master.cfg.sample $BASE_DIR/master.cfg
fi
exec gosu bldbotmaster buildbot start $BASE_DIR
fi
exec "$@"
答案 0 :(得分:2)
Buildbot bootstrap基于Twisted" .tac"文件,预计将使用twistd -y buildbot.tac
启动。
buildbot start
脚本实际上只是扭曲的一个方便包装器。它实际上只是运行twistd,然后监视日志以确认buildbot成功启动。在此日志监视之外没有任何增值,因此使用buildbot start启动buildbot并非严格要求。
您可以使用twistd -y buildbot.tac
启动它。
当您指出官方docker镜像正在使用twistd -ny buildbot.tac
启动buildbot
如果你看看twistd的帮助,-y意味着Twisted守护进程将运行.tac文件,-n意味着它不会进行守护进程。
这是因为docker自己正在进行进程监视,并且不希望它的入口点进行守护。
buildbot start
命令还有一个--nodaemon
选项,它实际上只是twistd -ny
的执行者。
因此,对于您的dockerfile,您也可以twistd -ny
或buildbot start --nodaemon
,这将是相同的。
另一个Docker具体是buildbot.tac是不同的。它将twistd日志配置为输出到stdout而不是输出到twisted.log。 这是因为docker设计期望日志在stdout中,以便您可以独立于应用程序的技术配置任何花哨的云日志转发器。
答案 1 :(得分:0)
我已经再次研究了docker参考和buildbot手册,并找到了一个提示。
有ngnix
示例
不要将
service x start
命令传递给分离的容器。例如,此命令尝试启动nginx服务。
$ docker run -d -p 80:80 my_image service nginx start
成功启动容器内的
nginx
服务。但是,它失败了分离的容器范例,因为根进程(service nginx start
)返回并且分离的容器按设计停止。因此,nginx
服务已启动但无法使用。相反,要启动诸如nginx Web服务器之类的进程,请执行以下操作:
$ docker run -d -p 80:80 my_image nginx -g 'daemon off;'
另一方面,有一个选项
--nodaemon
选项指示Buildbot跳过守护进程。该过程将从前台开始。它只会在停止时返回命令行。
上述两个步骤都产生了
exec gosu bldbotmaster buildbot start --nodaemon $BASE_DIR
在start
脚本行中的行,至少解决了突然终止现象。