守护进程 buildbot 启动

Daemonized buildbot start

我正在尝试编写最简单的 docker buildbot 主图像,运行s buildbot startENTRYPOINT/CMD Dockerfile 指令中。
我尝试使用 dumb-initgosuexec 的很多组合,但都没有成功。
情况如下:

  1. 当我尝试使用命令 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 运行宁

  2. 当我 运行 容器与命令 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 -nybuildbot start --nodaemon,这将同样有效。

另一个Docker具体是buildbot.tac不同。它将 twistd 日志配置为输出到标准输出而不是输出到 twisted.log。 这是因为 docker 设计期望日志在 stdout 中,这样您就可以独立于应用程序的技术配置任何奇特的云日志转发器。