守护进程 buildbot 启动
Daemonized buildbot start
我正在尝试编写最简单的 docker buildbot 主图像,运行s buildbot start
在 ENTRYPOINT/CMD
Dockerfile
指令中。
我尝试使用 dumb-init
、gosu
和 exec
的很多组合,但都没有成功。
情况如下:
当我尝试使用命令 docker run -d -v $local/vol/bldbot/master:/var/lib/buildbot buildbot-master-test
去 运行 deamonized buildroot 时,容器成功启动,但突然终止。日志如下所示:
[时间戳] [-] 日志打开。
[时间戳] [-] twistd 16.0.0 (/usr/bin/python 2.7.12) 正在启动。
[时间戳] [-] 反应堆 class: twisted.internet.epollreactor.EPollReactor.
[时间戳] [-] 启动 BuildMaster -- buildbot.version: 0.9.2
[时间戳] [-] 从 '/var/lib/buildbot/master.cfg'
加载配置
[时间戳] [-] 使用 URL 'sqlite:/state.sqlite'
设置数据库
[时间戳] [-] 将数据库日志模式设置为 'wal'
[时间戳] [-] 为 master 1 c8aa8b0d5ca3 做内务处理:/var/lib/buildbot
[时间戳] [-] 添加 1 个新的变更源,删除 0 个
[时间戳] [-] 添加 1 个新构建器,删除 0 个
[时间戳] [-] 添加 2 个新的调度程序,删除 0
[时间戳] [-] 此主机上未配置 Web 服务器
[时间戳] [-] 添加 1 个新工人,移除 0 个
[时间戳] [-] PBServerFactory 开始于 9989
[时间戳] [-] 开始工厂
[时间戳] [-] BuildMaster 运行宁
当我 运行 容器与命令 docker run --rm -it -v $local/vol/bldbot/master:/var/lib/buildbot buildbot-master-test /bin/sh
处于交互模式时,接下来我 运行 命令 buildbot start
一切都像魅力一样.
官方buildbot masterdocker镜像的内容我已经研究过了,即buildbot/buildbot-master
。我看到作者决定在 start_buildbot.sh 中使用命令 exec twistd -ny $B/buildbot.tac
,而不是他们自己的 buildbot start
.
所以问题是,如何在 运行 的 Dockerfile 中简单地编写 ENTRYPOINT/CMD
指令 buildbot start
。
附录 1
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"]
附录 2
start
脚本内容
#!/bin/sh
set -e
BASE_DIR=/var/lib/buildbot
if [[ "" = 'buildbot' && "" = '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 "$@"
我又研究了 docker reference and buildbot 手册,找到了一个提示。
有一个评论 ngnix
例子
Do not pass a service x start
command to a detached container. For example, this command attempts to start the nginx service.
$ docker run -d -p 80:80 my_image service nginx start
This succeeds in starting the nginx
service inside the container. However, it fails the detached container paradigm in that, the root process (service nginx start
) returns and the detached container stops as designed. As a result, the nginx
service is started but could not be used. Instead, to start a process such as the nginx web server do the following:
$ docker run -d -p 80:80 my_image nginx -g 'daemon off;'
另一方面还有一个选择
The --nodaemon
option instructs Buildbot to skip daemonizing. The process will start in the foreground. It will only return to the command-line when it is stopped.
以上两条路径都有收益
exec gosu bldbotmaster buildbot start --nodaemon $BASE_DIR
start
脚本行中至少解决了突然终止现象的行。
Buildbot bootstrap 基于 Twisted 的“.tac”文件,预计使用 twistd -y buildbot.tac
启动。
buildbot start
脚本实际上只是一个方便的 twistd 包装器。它实际上只是 运行 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
。
因此,对于您的 docker 文件,您也可以使用 twistd -ny
或 buildbot start --nodaemon
,这将同样有效。
另一个Docker具体是buildbot.tac不同。它将 twistd 日志配置为输出到标准输出而不是输出到 twisted.log。
这是因为 docker 设计期望日志在 stdout 中,这样您就可以独立于应用程序的技术配置任何奇特的云日志转发器。
我正在尝试编写最简单的 docker buildbot 主图像,运行s buildbot start
在 ENTRYPOINT/CMD
Dockerfile
指令中。
我尝试使用 dumb-init
、gosu
和 exec
的很多组合,但都没有成功。
情况如下:
当我尝试使用命令
docker run -d -v $local/vol/bldbot/master:/var/lib/buildbot buildbot-master-test
去 运行 deamonized buildroot 时,容器成功启动,但突然终止。日志如下所示:[时间戳] [-] 日志打开。
[时间戳] [-] twistd 16.0.0 (/usr/bin/python 2.7.12) 正在启动。
[时间戳] [-] 反应堆 class: twisted.internet.epollreactor.EPollReactor.
[时间戳] [-] 启动 BuildMaster -- buildbot.version: 0.9.2
[时间戳] [-] 从 '/var/lib/buildbot/master.cfg'
加载配置 [时间戳] [-] 使用 URL 'sqlite:/state.sqlite'
设置数据库 [时间戳] [-] 将数据库日志模式设置为 'wal'
[时间戳] [-] 为 master 1 c8aa8b0d5ca3 做内务处理:/var/lib/buildbot
[时间戳] [-] 添加 1 个新的变更源,删除 0 个
[时间戳] [-] 添加 1 个新构建器,删除 0 个
[时间戳] [-] 添加 2 个新的调度程序,删除 0
[时间戳] [-] 此主机上未配置 Web 服务器
[时间戳] [-] 添加 1 个新工人,移除 0 个
[时间戳] [-] PBServerFactory 开始于 9989
[时间戳] [-] 开始工厂
[时间戳] [-] BuildMaster 运行宁当我 运行 容器与命令
docker run --rm -it -v $local/vol/bldbot/master:/var/lib/buildbot buildbot-master-test /bin/sh
处于交互模式时,接下来我 运行 命令buildbot start
一切都像魅力一样.
官方buildbot masterdocker镜像的内容我已经研究过了,即buildbot/buildbot-master
。我看到作者决定在 start_buildbot.sh 中使用命令 exec twistd -ny $B/buildbot.tac
,而不是他们自己的 buildbot start
.
所以问题是,如何在 运行 的 Dockerfile 中简单地编写 ENTRYPOINT/CMD
指令 buildbot start
。
附录 1
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"]
附录 2
start
脚本内容
#!/bin/sh
set -e
BASE_DIR=/var/lib/buildbot
if [[ "" = 'buildbot' && "" = '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 "$@"
我又研究了 docker reference and buildbot 手册,找到了一个提示。
有一个评论 ngnix
例子
Do not pass a
service x start
command to a detached container. For example, this command attempts to start the nginx service.
$ docker run -d -p 80:80 my_image service nginx start
This succeeds in starting the
nginx
service inside the container. However, it fails the detached container paradigm in that, the root process (service nginx start
) returns and the detached container stops as designed. As a result, thenginx
service is started but could not be used. Instead, to start a process such as the nginx web server do the following:
$ docker run -d -p 80:80 my_image nginx -g 'daemon off;'
另一方面还有一个选择
The
--nodaemon
option instructs Buildbot to skip daemonizing. The process will start in the foreground. It will only return to the command-line when it is stopped.
以上两条路径都有收益
exec gosu bldbotmaster buildbot start --nodaemon $BASE_DIR
start
脚本行中至少解决了突然终止现象的行。
Buildbot bootstrap 基于 Twisted 的“.tac”文件,预计使用 twistd -y buildbot.tac
启动。
buildbot start
脚本实际上只是一个方便的 twistd 包装器。它实际上只是 运行 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
。
因此,对于您的 docker 文件,您也可以使用 twistd -ny
或 buildbot start --nodaemon
,这将同样有效。
另一个Docker具体是buildbot.tac不同。它将 twistd 日志配置为输出到标准输出而不是输出到 twisted.log。 这是因为 docker 设计期望日志在 stdout 中,这样您就可以独立于应用程序的技术配置任何奇特的云日志转发器。