如何以非root用户启动带SSH服务的Semaphore Docker容器?
以非root用户启动容器并运行SSH服务的可行方案
针对你的场景(基于semaphoreui/semaphore:latest构建带SSH服务的镜像,希望以semaphore非root用户直接启动容器并运行SSH),有两种实用方案:
方案1:修改SSH监听端口至非特权端口(无需额外容器权限)
非root用户无法绑定1-1024的特权端口(默认SSH的22端口属于此类),因此将SSH端口改为大于1024的数值即可让非root用户启动SSH服务,同时保留Semaphore服务的正常运行。
调整后的Dockerfile示例
FROM semaphoreui/semaphore:latest # 安装OpenSSH服务及依赖 RUN apt-get update && apt-get install -y openssh-server && rm -rf /var/lib/apt/lists/* # 修改SSH配置:切换至非特权端口、禁用root登录、允许semaphore用户登录 RUN sed -i 's/Port 22/Port 2222/' /etc/ssh/sshd_config && \ sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config && \ echo "AllowUsers semaphore" >> /etc/ssh/sshd_config && \ # 确保SSH运行目录权限对semaphore用户开放 mkdir -p /var/run/sshd && chown semaphore:semaphore /var/run/sshd # 配置semaphore用户的SSH密钥(替换为你的公钥) RUN mkdir -p /home/semaphore/.ssh && \ echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ..." > /home/semaphore/.ssh/authorized_keys && \ chown -R semaphore:semaphore /home/semaphore/.ssh && \ chmod 700 /home/semaphore/.ssh && chmod 600 /home/semaphore/.ssh/authorized_keys # 创建启动脚本:同时启动SSH服务和Semaphore主服务 RUN echo '#!/bin/bash' > /start.sh && \ echo '/usr/sbin/sshd -D -e &' >> /start.sh && \ echo 'exec /usr/bin/semaphore' >> /start.sh && \ chmod +x /start.sh # 切换至semaphore用户 USER semaphore # 设置启动命令 CMD ["/start.sh"]
启动容器命令
docker run -d -p 2222:2222 -p 3000:3000 semaphore:ssh
(3000端口为SemaphoreUI的默认端口,根据你的需求调整)
方案2:使用容器权限绑定特权端口(保留22端口)
如果必须使用默认的22端口,可通过Docker的NET_BIND_SERVICE权限让非root用户绑定特权端口,同时改用更轻量的Dropbear SSH服务器(原生支持非root运行)。
调整后的Dockerfile示例
FROM semaphoreui/semaphore:latest # 安装Dropbear SSH服务 RUN apt-get update && apt-get install -y dropbear && rm -rf /var/lib/apt/lists/* # 生成Dropbear的SSH主机密钥 RUN dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key # 配置semaphore用户的SSH密钥(替换为你的公钥) RUN mkdir -p /home/semaphore/.ssh && \ echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ..." > /home/semaphore/.ssh/authorized_keys && \ chown -R semaphore:semaphore /home/semaphore/.ssh && \ chmod 700 /home/semaphore/.ssh && chmod 600 /home/semaphore/.ssh/authorized_keys # 创建启动脚本:启动Dropbear和Semaphore主服务 RUN echo '#!/bin/bash' > /start.sh && \ echo 'dropbear -p 22 -r /etc/dropbear/dropbear_rsa_host_key -B' >> /start.sh && \ echo 'exec /usr/bin/semaphore' >> /start.sh && \ chmod +x /start.sh # 切换至semaphore用户 USER semaphore # 设置启动命令 CMD ["/start.sh"]
启动容器命令
docker run -d -p 22:22 -p 3000:3000 --cap-add NET_BIND_SERVICE semaphore:ssh
关键注意事项
- 始终优先使用SSH密钥登录,禁用密码登录以避免安全风险。
- 方案1无需额外容器权限,安全性更高;方案2保留了默认SSH端口,但需要授予容器绑定特权端口的权限。
- 启动脚本中使用
exec运行Semaphore主服务,确保容器能正确响应Docker的停止信号。
内容的提问来源于stack exchange,提问作者Salvatore Esposito
相关产品推荐
相关产品推荐

