You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:47:05