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

如何向Docker容器中添加服务?ASP.NET Core容器调用ssh提示找不到命令

问题排查与解决方案

你构建阶段能正常执行ssh测试,是因为Docker构建过程中所有RUN指令默认以root用户执行,而容器启动运行应用时默认切换为低权限的app用户,两者的运行环境权限、PATH变量、可访问目录都不一样,这就是构建正常运行报错的核心差异点。具体排查解决方向如下:

1. 补全脚本shebang声明

你当前的Import.sh没有指定解释器,运行时可能调用了不继承系统PATH变量的极简shell环境,导致找不到ssh命令。
在Import.sh第一行添加shebang声明即可:

#!/bin/bash
ssh -o StrictHostKeyChecking=no troom@192.168.0.200

如果容器中未预装bash,可替换为#!/bin/sh。

2. 调整容器运行用户或ssh配置权限

微软官方aspnet:3.1镜像默认运行用户是无root权限的app,你把私钥存到了只有root能访问的/root/.ssh目录下,且低权限用户可能无法读取ssh命令的执行路径,可二选一解决:

  • 方案A(简单快捷):指定容器以root用户运行,在Dockerfile的final阶段新增USER root指令:
    FROM base AS final
    WORKDIR /app
    # 新增:指定运行用户为root,和构建阶段执行权限一致
    USER root
    
    ## 原有安装ssh的逻辑优化,安装后清理apt缓存减少镜像体积
    RUN apt-get update && apt-get install -y openssh-client && rm -rf /var/lib/apt/lists/*
    ## 后续原有逻辑保持不变
    RUN mkdir -p /root/.ssh && \
      chmod 0700 /root/.ssh 
    COPY id_rsa /root/.ssh/id_rsa
    # 新增:补充私钥权限配置,避免ssh因为私钥权限过高拒绝访问
    RUN chmod 600 /root/.ssh/id_rsa
    
  • 方案B(更安全):将ssh配置放到app用户可访问的目录下,不启用root权限:
    RUN apt-get update && apt-get install -y openssh-client && rm -rf /var/lib/apt/lists/*
    # 将ssh目录配置到app用户的home路径下
    RUN mkdir -p /home/app/.ssh && \
      chmod 0700 /home/app/.ssh && \
      chown app:app /home/app/.ssh
    # 复制私钥时修改归属为app用户
    COPY --chown=app:app id_rsa /home/app/.ssh/id_rsa
    RUN chmod 600 /home/app/.ssh/id_rsa
    

3. 调用ssh时使用绝对路径

部分轻量镜像中ssh安装路径未默认加入普通用户的PATH变量,可直接在脚本中写ssh的绝对路径:

#!/bin/bash
/usr/bin/ssh -o StrictHostKeyChecking=no troom@192.168.0.200

快速验证方法

容器启动后执行以下命令可快速定位问题:

# 进入运行中的容器
docker exec -it <你的容器ID/名称> bash
# 验证ssh命令是否存在
which ssh
# 查看当前运行用户
whoami
# 手动执行脚本查看具体报错
bash /app/scripts/Import.sh

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:18:03