linux - 守护进程 buildbot 启动

标签 linux docker dockerfile buildbot

我正在尝试编写在 ENTRYPOINT/CMD Dockerfile 指令中运行 buildbot start 的最简单的 docker buildbot 主镜像。
我已经尝试使用 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) 正在启动。
    [时间戳] [-] react 堆类: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 个新 worker ,移除 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 master docker镜像的内容,即buildbot/buildbot-master。我看到作者决定在 start_buildbot.sh 中使用命令 exec twistd -ny $B/buildbot.tac ,而不是他们自己的 buildbot start

所以问题是,如何在运行 buildbot start 的 Dockerfile 中编写 ENTRYPOINT/CMD 指令。


附录 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

开始脚本内容

#!/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 "$@"

最佳答案

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。 因此,对于您的 dockerfile,您也可以使用 twistd -nybuildbot start --nodaemon,它们的工作原理相同。

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

关于linux - 守护进程 buildbot 启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41299608/

相关文章:

amazon-web-services - AWS lambda : "Unable to import module ' app': No module named 'models' "

r - 如何在 Docker 容器中运行 R Shiny App

docker - 创建一个自定义文件夹并分配用户权限

linux - mkbundle System.ComponentModel.Win32Exception 错误

c++ - 为什么 C-forkbombs 不像 bash 那样工作?

Docker BaseX DBA

docker - 群负载均衡是否应该对其节点执行健康检查?

c - fwrite() 阻止调用并且不写入文件

linux - Linux 内核如何决定使用哪个内存区域?

node.js - 使用 pm2 在 Docker 容器中启动两个 nodejs 应用程序