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

SSH -T连接AWS实例执行Docker命令失败求助

问题描述

通过CI/CD管道(命令行执行同样失败)执行以下SSH命令连接AWS EC2实例,完成Docker部署操作:

ssh -o StrictHostKeyChecking=no -t -i ec2-key.pem ${EC2_USER}@${EC2_HOST} <<EOF
docker stop users
echo ${DOCKER_PASSWORD} | docker login --username ${DOCKER_USERNAME} --password-stdin
docker pull ${DOCKER_REPO}/${IMAGE_NAME}:${IMAGE_VERSION}
docker run -d -p 27050:27050 --name "users" ${DOCKER_REPO}/${IMAGE_NAME}:${IMAGE_VERSION}
EOF

执行后会停滞在Ubuntu系统更新提示处无法继续;去掉-t参数可正常SSH,但CI/CD管道依赖该参数。排查发现问题出在Docker登录环节,报错如下:

Error: Cannot perform an interactive login from a non TTY device
invalid reference format
docker: invalid reference format.
解决方案

1. 修复TTY与Docker登录的冲突

-t参数强制分配伪终端,但会和Docker的--password-stdin交互逻辑冲突。改用-tt参数(强制分配TTY,适配非交互式环境),同时调整变量解析方式:

ssh -o StrictHostKeyChecking=no -tt -i ec2-key.pem ${EC2_USER}@${EC2_HOST} <<'EOF'
# 容器不存在时不中断流程
docker stop users || true
# 用双引号包裹变量,避免格式错误
echo "$DOCKER_PASSWORD" | docker login --username "$DOCKER_USERNAME" --password-stdin
docker pull "$DOCKER_REPO/$IMAGE_NAME:$IMAGE_VERSION"
docker run -d -p 27050:27050 --name "users" "$DOCKER_REPO/$IMAGE_NAME:$IMAGE_VERSION"
EOF

核心修改说明:

  • -tt:强制分配TTY,解决CI/CD非交互式环境下的TTY需求
  • <<'EOF':阻止本地Shell解析远程命令中的变量,确保变量在EC2实例端正确读取
  • 变量加双引号:避免变量含特殊字符或空格导致镜像地址格式错误
  • docker stop users || true:防止容器未运行时命令报错中断后续部署

2. 屏蔽Ubuntu系统更新提示

若系统更新提示导致命令停滞,在远程命令开头添加以下内容禁用提示:

sudo rm -f /var/run/reboot-required /var/run/reboot-required.pkgs
export DEBIAN_FRONTEND=noninteractive

完整命令示例:

ssh -o StrictHostKeyChecking=no -tt -i ec2-key.pem ${EC2_USER}@${EC2_HOST} <<'EOF'
sudo rm -f /var/run/reboot-required /var/run/reboot-required.pkgs
export DEBIAN_FRONTEND=noninteractive
docker stop users || true
echo "$DOCKER_PASSWORD" | docker login --username "$DOCKER_USERNAME" --password-stdin
docker pull "$DOCKER_REPO/$IMAGE_NAME:$IMAGE_VERSION"
docker run -d -p 27050:27050 --name "users" "$DOCKER_REPO/$IMAGE_NAME:$IMAGE_VERSION"
EOF

3. 排查镜像地址格式错误

若仍出现invalid reference format,需验证:

  • DOCKER_REPO、IMAGE_NAME、IMAGE_VERSION变量是否包含空格、特殊字符
  • CI/CD环境中所有环境变量是否已正确注入
  • 可在远程命令开头添加echo "$DOCKER_REPO/$IMAGE_NAME:$IMAGE_VERSION",打印镜像地址确认格式正确性

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 07:18:16