如何在Dockerfile中配置启动ssh-agent,解决ssh-add无法连接问题
问题根因
- 现有Dockerfile的ENTRYPOINT与CMD组合存在逻辑缺陷:实际容器启动时执行的命令为
/bin/bash -l -c "eval \"$(ssh-agent -s)\"",该命令执行完成后对应的bash进程直接退出,即使添加-it参数启动容器,ssh-agent输出的SSH_AUTH_SOCK、SSH_AGENT_PID环境变量也仅在当前单次执行的子shell中生效,后续进入容器的交互式shell无法读取到这些变量,最终导致ssh-add找不到agent的连接地址。 - ssh-agent的正常使用依赖当前shell的环境变量注入,单次执行eval命令无法将变量持久化到所有ryan用户的登录会话中。
修复方案
推荐将ssh-agent的启动逻辑写入ryan用户的.bashrc配置文件,所有以ryan用户启动的bash会话都会自动加载ssh-agent环境,无需调整容器启动参数,修改后的Dockerfile如下:
FROM ubuntu:latest ENV TZ=Australia/Sydney RUN set -ex; \ # NOTE(Ryan): Prevent docker build hanging on timezone confirmation ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone; \ apt update; \ apt install -y --no-install-recommends \ sudo ca-certificates git gnupg openssh-client vim; \ useradd -m ryan -g sudo; \ printf "ryan ALL=(ALL:ALL) NOPASSWD:ALL" | sudo EDITOR="tee -a" visudo; \ # NOTE(Ryan): Prevent sudo usage prompt appearing on startup touch /home/ryan/.sudo_as_admin_successful; \ git clone https://github.com/ryan-mcclue/cas.git /home/ryan/cas; \ chmod 777 -R /home/ryan/cas; \ # 新增:将ssh-agent启动逻辑写入用户bash启动配置,避免重复启动进程 echo 'if [ -z "$SSH_AGENT_PID" ] || ! kill -0 "$SSH_AGENT_PID" 2>/dev/null; then eval "$(ssh-agent -s)" > /dev/null 2>&1; fi' >> /home/ryan/.bashrc USER ryan WORKDIR /home/ryan/cas # 直接启动登录式bash,自动加载.bashrc配置 CMD ["/bin/bash", "-l"]
验证方法
使用docker run -it <构建后的镜像名>启动容器,直接执行ssh-add即可正常运行,后续通过docker exec -it <运行中的容器名> bash进入容器,也会自动复用已启动的ssh-agent进程,不会重复创建新进程。
内容的提问来源于stack exchange,提问作者Edward Chamberlain
相关产品推荐
相关产品推荐

