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

将ASP.NET Core部署到Azure VM时遇dotnet: command not found问题

问题描述

我在Microsoft Azure中创建并配置了一台VM,正通过GitHub Actions将ASP.NET Core应用部署至该Azure VM。deploy.yml文件中的所有步骤均成功执行,但最后一步抛出错误:

dotnet: command not found

尽管dotnet已安装且我已配置了环境变量路径,但仍出现该问题,疑似路径配置存在异常。

以下是deploy.yml文件内容:

name: Deploy to Azure VM

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout repository
      uses: actions/checkout@v2

    - name: Setup .NET Core
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: '8.x'

    - name: Cache .NET packages
      uses: actions/cache@v2
      with:
        path: |
          ~/.nuget/packages
          ~/.dotnet
        key: ${{ runner.os }}-dotnet-${{ hashFiles('**/*.csproj') }}
        restore-keys: |
          ${{ runner.os }}-dotnet-

    - name: Install .NET Core on Azure VM
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.AZURE_VM_IP_ADDRESS }}
        username: ${{ secrets.AZURE_VM_USERNAME }}
        key: ${{ secrets.AZURE_VM_SSH_PRIVATE_KEY }}
        script: |
          wget https://dot.net/v1/dotnet-install.sh
          chmod +x dotnet-install.sh
          sudo ./dotnet-install.sh --install-dir /usr/share/dotnet --version latest
          export PATH=$PATH:/usr/share/dotnet

    - name: Build and publish ASP.NET Core app
      run: |
        dotnet restore
        dotnet build -c Release
        dotnet publish -c Release -o ./publish

    - name: Cache published files
      uses: actions/cache@v2
      with:
        path: |
          ./publish
        key: ${{ runner.os }}-dotnet-publish-${{ hashFiles('**/*.csproj') }}
        restore-keys: |
          ${{ runner.os }}-dotnet-publish-

    - name: Create /applocation folder on Azure VM
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.AZURE_VM_IP_ADDRESS }}
        username: ${{ secrets.AZURE_VM_USERNAME }}
        key: ${{ secrets.AZURE_VM_SSH_PRIVATE_KEY }}
        script: |
          sudo mkdir -p /applocation
          sudo chown $USER:$USER /applocation

    - name: Copy files to Azure VM
      uses: appleboy/scp-action@master
      with:
        host: ${{ secrets.AZURE_VM_IP_ADDRESS }}
        username: ${{ secrets.AZURE_VM_USERNAME }}
        key: ${{ secrets.AZURE_VM_SSH_PRIVATE_KEY }}
        source: './publish'
        target: '/applocation'

    - name: SSH into Azure VM and deploy
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.AZURE_VM_IP_ADDRESS }}
        username: ${{ secrets.AZURE_VM_USERNAME }}
        key: ${{ secrets.AZURE_VM_SSH_PRIVATE_KEY }}
        script: |
          cd /applocation
          source ~/.bashrc || source ~/.bash_profile || true
          export PATH=$PATH:/usr/share/dotnet
          echo "Current PATH: $PATH"
          which dotnet || true
          dotnet AzureVirtualMachineDeploymentDemo2.dll

    - name: Clean up
      run: |
        rm -rf ./publish
解决方案

核心问题

  • 每次appleboy/ssh-action执行的是独立SSH会话,之前会话设置的PATH不会保留到后续会话
  • dotnet-install.sh默认不会自动将dotnet路径写入全局环境变量,仅当前临时会话生效

具体修复步骤

1. 安装dotnet时配置全局环境变量

修改Install .NET Core on Azure VM步骤的脚本,将dotnet路径写入系统全局profile文件,确保所有会话都能读取:

wget https://dot.net/v1/dotnet-install.sh
chmod +x dotnet-install.sh
sudo ./dotnet-install.sh --install-dir /usr/share/dotnet --version latest
# 将dotnet路径添加到全局环境变量文件
echo 'export PATH=$PATH:/usr/share/dotnet' | sudo tee /etc/profile.d/dotnet.sh
# 让当前会话立即生效
source /etc/profile.d/dotnet.sh

2. 直接用绝对路径执行dotnet(最可靠)

在最后部署步骤中,跳过依赖PATH的环节,直接使用dotnet的绝对路径执行:

cd /applocation
/usr/share/dotnet/dotnet AzureVirtualMachineDeploymentDemo2.dll

3. 可选:验证dotnet安装状态

如果问题仍存在,在部署脚本中先确认dotnet文件是否存在且可执行:

cd /applocation
# 检查文件存在性与权限
ls -la /usr/share/dotnet/dotnet
if [ -x /usr/share/dotnet/dotnet ]; then
    /usr/share/dotnet/dotnet --version
fi

修复后的关键配置片段

- name: Install .NET Core on Azure VM
  uses: appleboy/ssh-action@master
  with:
    host: ${{ secrets.AZURE_VM_IP_ADDRESS }}
    username: ${{ secrets.AZURE_VM_USERNAME }}
    key: ${{ secrets.AZURE_VM_SSH_PRIVATE_KEY }}
    script: |
      wget https://dot.net/v1/dotnet-install.sh
      chmod +x dotnet-install.sh
      sudo ./dotnet-install.sh --install-dir /usr/share/dotnet --version latest
      echo 'export PATH=$PATH:/usr/share/dotnet' | sudo tee /etc/profile.d/dotnet.sh
      source /etc/profile.d/dotnet.sh

- name: SSH into Azure VM and deploy
  uses: appleboy/ssh-action@master
  with:
    host: ${{ secrets.AZURE_VM_IP_ADDRESS }}
    username: ${{ secrets.AZURE_VM_USERNAME }}
    key: ${{ secrets.AZURE_VM_SSH_PRIVATE_KEY }}
    script: |
      cd /applocation
      /usr/share/dotnet/dotnet AzureVirtualMachineDeploymentDemo2.dll

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:25:54