Daemonized buildbot启动

uto*_*tom 5 linux buildbot docker dockerfile

我正在尝试编写buildbot startENTRYPOINT/CMD Dockerfile指令中运行的最简单的docker buildbot主映像.
我试着用很多的组合dumb-init,gosuexec,但没有成功.
情况如下:

  1. 当我尝试使用该命令运行deamonized buildroot时docker run -d -v $local/vol/bldbot/master:/var/lib/buildbot buildbot-master-test,容器启动成功,但它突然终止.日志如下所示:

    [timestamp] [ - ]日志已打开.
    [timestamp] [ - ] twistd 16.0.0(/ usr/bin/python 2.7.12)启动.
    [timestamp] [ - ] reactor类:twisted.internet.epollreactor.EPollReactor.
    [timestamp] [ - ]启动BuildMaster - buildbot.version:0.9.2
    [timestamp] [ - ]从'/var/lib/buildbot/master.cfg'加载配置
    [timestamp] [ - ]使用URL设置数据库' sqlite:/state.sqlite'
    [timestamp] [ - ]将数据库日志模式设置为'wal'
    [timestamp] [ - ]为master 1做家务c8aa8b0d5ca3:/ var/lib/buildbot
    [timestamp] [ - ]添加1个新的sourcesources ,删除0
    [timestamp] [ - ]添加1个新构建器,删除0
    [timestamp] [ - ]添加2个新调度程序,删除0
    [timestamp] [ - ]此master上没有配置Web服务器
    [timestamp] [ - ]添加1新工人,删除0
    [timestamp] [ - ] PBServerFactory从9989开始
    [timestamp] [ - ]开始工厂
    [timestamp] [ - ] BuildMaster正在运行

  2. 当我使用命令以交互模式运行容器时docker run --rm -it -v $local/vol/bldbot/master:/var/lib/buildbot buildbot-master-test /bin/sh,接下来我运行命令buildbot start就像魅力一样.

我已经研究过官方buildbot master docker镜像的内容,即buildbot/buildbot-master.我看到作者决定exec twistd -ny $B/buildbot.tacstart_buildbot.sh中使用该命令,而不是他们自己的命令buildbot start.

所以问题是,如何ENTRYPOINT/CMD编写简单运行的Dockerfile中的指令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"]
Run Code Online (Sandbox Code Playgroud)

附录2

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 "$@"
Run Code Online (Sandbox Code Playgroud)

tar*_*dyp 3

Buildbot 引导程序基于 Twisted 的“.tac”文件,预计将使用twistd -y buildbot.tac. 该buildbot start脚本实际上只是twistd 的一个方便包装。它实际上只是运行twistd,然后监视日志以确认buildbot 已成功启动。除了此日志监视之外,没有任何附加值,因此并不严格强制使用 buildbot start 来启动 buildbot。您可以直接使用 来启动它twistd -y buildbot.tac

正如您所指出的,官方 docker 映像正在启动 buildbottwistd -ny buildbot.tac 如果您查看 twind 的帮助,-y 表示 Twisted 守护进程将运行 .tac 文件,而 -n 表示它不会守护进程。这是因为 docker 正在自行进行进程监视,并且不希望其入口点进行守护进程。

buildbot start命令还有一个--nodaemon选项,实际上只是“执行”到twistd -ny. 因此,对于您的 dockerfile,您也可以使用 ustwistd -nybuildbot start --nodaemon,这将起到相同的作用。

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