Daemonized buildbot启动

时间:2016-12-23 10:25:28

标签: linux docker dockerfile buildbot

我尝试在buildbot start ENTRYPOINT/CMD条指令中撰写运行Dockerfile的最简单的docker buildbot主映像。
我尝试过使用dumb-initgosuexec的大量组合,但没有成功。
情况如下:

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

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

  3. 我已经研究过官方buildbot主泊坞窗映像的内容,即buildbot/buildbot-master。我看到作者决定在start_buildbot.sh中使用exec twistd -ny $B/buildbot.tac命令,而不是他们自己的buildbot start

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

    ADDENDUM 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"]
    

    ADDENDUM 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 "$@"
    

2 个答案:

答案 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 -nybuildbot 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脚本行中的行,至少解决了突然终止现象。