我正在尝试编写在 ENTRYPOINT/CMD
Dockerfile
指令中运行 buildbot start
的最简单的 docker buildbot 主镜像。
我已经尝试使用 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) 正在启动。
[时间戳] [-] 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 正在运行当我使用命令
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 -ny
或 buildbot start --nodaemon
,它们的工作原理相同。
另一个 Docker 特定的是 buildbot.tac 是不同的。它将 twistd 日志配置为输出到 stdout 而不是输出到 twisted.log。 这是因为 docker design 期望日志在 stdout 中,这样您就可以独立于应用程序的技术配置任何奇特的云日志转发器。
关于linux - 守护进程 buildbot 启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41299608/