supervisord + docker 启动汇总

今天收到supervisord报警,说是有docker进程异常退出,而且无法启动,这个里面有两个问题:
1. 为啥会异常退出?
2. 为啥无法启动

先看第二个问题,经过排查,原来是由于docker 容器进程挂掉后,会留在docker ps -a里面,提示有重名docker在运行,这个我们需要手动干掉

docker ps -a | grep Exit | awk '{print $1}' | xargs -i docker stop {}

另外,检查supervisord的配置,docker命令后面有没有加 –rm,这样可以确保docker进程在退出后也会自动删除。

经过排查,–rm也是加了的,可是为啥还是会不能自动重启呢,继续观察。

这里写图片描述

for owncloud cadvisor registry reg-ui

[program:owncloud]
priority=1
command=/usr/bin/docker run --rm -p 83:80 -v /data/owncloud/data:/var/www/html owncloud:latest
autostart=true
autorestart=true
startretries=3
stopsignal=TERM
stopasgroup=true        ; 是否想UNIX进程组发送结束信号 (default false)
killasgroup=true             ; SIGKILL UNIX 进

[program:cadvisor]
priority=1
command=/usr/bin/docker run --rm --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=4080:8080  --name=cadvisor google/cadvisor:latest
autostart=true
autorestart=true
startretries=3
stopsignal=TERM
stopasgroup=true        ; 是否想UNIX进程组发送结束信号 (default false)
killasgroup=true             ; SIGKILL UNIX 进

[program:registry]
priority=1
command=/usr/bin/docker run --rm -p 5000:5000 --name registry -v /data/docker/reg.ops.ac.cn/registry/data:/var/lib/registry -v /data/docker/reg.ops.ac.cn/registry/data:/tmp/registry registry:2.3.1
directory=/data/docker/reg.ops.ac.cn/registry
autostart=true
autorestart=true
startretries=3
stopsignal=TERM
stopasgroup=true        ; 是否想UNIX进程组发送结束信号 (default false)
killasgroup=true             ; SIGKILL UNIX 进

[program:reg-ui]
priority=1
#command=/usr/bin/docker run --rm -p 4050:8080 --name registry-web --link registry -e REGISTRY_URL=http://reg.ops.ac.cn:5000/v2 -e REGISTRY_BASIC_AUTH="b3BzOjEyMzEyMw==" -e REGISTRY_TRUST_ANY_SSL=true -e REGISTRY_NAME=reg.ops.ac.cn:5000 hyper/docker-registry-web
command=/usr/bin/docker run --rm -p 4050:8080 --name registry-web -e REGISTRY_URL=http://reg.ops.ac.cn:5000/v2 -e REGISTRY_BASIC_AUTH="b3BzOjEyMzEyMw==" -e REGISTRY_TRUST_ANY_SSL=true -e REGISTRY_NAME=reg.ops.ac.cn:5000 hyper/docker-registry-web
directory=/data/docker/reg-ui
autostart=true
autorestart=true
startretries=3
stopsignal=TERM
stopasgroup=true        ; 是否想UNIX进程组发送结束信号 (default false)
killasgroup=true             ; SIGKILL UNIX 进
### 配置Docker以在启动时自动运行带有桌面环境的容器 #### 启动带图形界面的应用程序 为了使Docker容器能够在启动时自动加载并显示桌面环境,通常需要解决X11转发的问题。Linux下的图形应用程序通过X Window System (也称为X11) 来创建窗口和绘制UI组件。 对于本地主机与容器之间的交互,可以通过设置`DISPLAY`环境变量来实现这一点[^1]。具体来说: - 主机上应该已经安装了一个X服务器(例如VcXsrv或Xming),用于接收来自容器内GUI应用的请求。 - 在启动容器之前,先确认宿主机上的X server正在运行,并允许网络连接访问它。 - 使用`docker run`命令中的`-e DISPLAY=$DISPLAY`选项传递当前系统的DISPLAY值给容器,同时使用`--net=host`参数简化网络配置以便于X11通信[^2]。 ```bash export DISPLAY=$(ip route show | grep -oP 'src \K\S+'):$DISPLAY xhost +local:docker # 允许来自docker容器的连接 docker run -it --rm \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e DISPLAY=$DISPLAY \ your_image_name_with_desktop_env ``` 这段脚本做了如下几件事: - 设置了正确的IP地址作为`DISPLAY`变量的一部分; - 给予权限让名为`docker`用户的进程能够向X server发送请求; - 将宿主机的`.X11-unix`目录挂载到容器内部,使得两者共享Unix socket文件,从而完成X11协议的数据交换; - 运行指定含有桌面环境镜像的容器实例。 请注意,上述方法适用于Linux和macOS平台;而在Windows平台上,则需额外考虑如何正确配置X服务端软件如VcXsrv等。 另外一种更现代的方式是在基于Wayland协议的新一代Linux发行版中处理图形化应用程序。然而,由于大多数官方基础镜像仍然默认支持X11而不是Wayland,因此这里主要讨论的是针对X11的情况。 #### 自定义入口点脚本 为了让容器每次重启都能自动进入桌面模式,可以在构建自定义Dockerfile时加入特定的服务管理机制,比如systemd或者supervisord,用来确保多个后台进程协同工作正常启动整个桌面会话。不过这可能涉及到较为复杂的初始化过程和服务依赖关系调整。 另一种简单的方法是编写一个简单的shell脚本来充当容器的主要执行体,在这个脚本里依次调用必要的命令来激活桌面环境及其相关联的服务。最后把这个脚本设为ENTRYPOINT指令的内容之一。 ```dockerfile FROM ubuntu:latest ... COPY start-desktop.sh / RUN chmod +x /start-desktop.sh CMD ["/bin/bash", "/start-desktop.sh"] ``` 其中`start-desktop.sh`可能是这样的形式: ```sh #!/bin/sh set -e # Start any required services here, e.g., Xvfb for headless display. service lightdm start & exec "$@" ``` 此脚本会在容器启动期间按照顺序执行一系列预定义的操作,最终达到自动化部署的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值