执行xvfb run as docker自定义命令



xvfb run是否有任何原因不会作为docker重写命令执行?

拥有来自Dockerfile:的图像

FROM ubuntu:20.04
RUN apt-get update && apt-get install -y xvfb

内置:

docker build -f Dockerfile.xvfb -t xvfb-test 

如果我用xfvb运行一个自定义docker命令:

docker run xvfb-test bash -x /usr/bin/xvfb-run echo

它被卡住并且永远不会结束

但是,如果我进入图像docker run --rm -it xvfb-test bash,并执行相同的命令xvfb run echo,它会立即完成(这意味着xvfb服务器启动并能够执行该命令(

这是xvfb运行脚本的摘录:

...
trap : USR1
(trap '' USR1; exec Xvfb ":$SERVERNUM" $XVFBARGS $LISTENTCP -auth $AUTHFILE >>"$ERRORFILE" 2>&1) &
XVFBPID=$!
wait || :
...

使用bash -x执行时,我们可以看到最后执行的行是什么:

+ XAUTHORITY=/tmp/xvfb-run.YwmHlq/Xauthority
+ xauth source -
+ trap : USR1
+ XVFBPID=16
+ wait
+ trap '' USR1
+ exec Xvfb :99 -screen 0 1280x1024x24 -nolisten tcp -auth /tmp/xvfb-run.YwmHlq/Xauthority

从此链接

run命令中的docker--init选项基本上将ENTRYPOINT设置为tini,并将CMD传递给它或您在命令行中指定的任何东西。如果没有init,CMD将变为pid 1。在这种情况下,/bin/bash

看起来像是在没有init参数的情况下运行命令,作为PID 1运行,没有正确处理信号USR1。

注意到xvfb运行脚本及其被阻塞的位置,信号USR1(xvfb进程发送的(似乎从未传播到等待语句。

强制信号传播的一种方法是在docker run命令中添加--init标志。从文档来看,这正是它所做的。

在容器内运行一个init,该init转发信号并重新处理

最新更新