在运行Jenkins的Docker容器中拒绝了Dotnet构建许可

时间:2018-11-30 11:25:57

标签: .net docker jenkins asp.net-core build

我正在尝试使用Jenkins构建.NET应用程序。 Jenkins实例在Docker容器中运行。

我的Jenkins文件如下:

pipeline {
  agent {
    docker {
      image 'microsoft/dotnet:2.1-sdk'
      registryUrl 'https://index.docker.io/v1/'
    }
  }
  stages {
    stage('Build') {
      steps {
        sh 'dotnet build MyApplication/Application.csproj -c Release -o /app'
      }
    }
    stage('Test') {
      steps {
        sh 'dotnet test MyApplication/Application.csproj -c Release -r /results'
      }
    }
  }
}

当我尝试构建时,我在Jenkins构建输出中看到以下错误:

System.UnauthorizedAccessException: Access to the path '/.dotnet' is denied. ---> System.IO.IOException: Permission denied
   --- End of inner exception stack trace ---
   at System.IO.FileSystem.CreateDirectory(String fullPath)
   at System.IO.Directory.CreateDirectory(String path)
   at Microsoft.Extensions.EnvironmentAbstractions.DirectoryWrapper.CreateDirectory(String path)
   at Microsoft.DotNet.Configurer.FileSentinel.Create()
   at Microsoft.DotNet.Configurer.DotnetFirstTimeUseConfigurer.Configure()
   at Microsoft.DotNet.Cli.Program.ConfigureDotNetForFirstTimeUse(INuGetCacheSentinel nugetCacheSentinel, IFirstTimeUseNoticeSentinel firstTimeUseNoticeSentinel, IAspNetCertificateSentinel aspNetCertificateSentinel, IFileSentinel toolPathSentinel, Boolean hasSuperUserAccess, DotnetFirstRunConfiguration dotnetFirstRunConfiguration, IEnvironmentProvider environmentProvider)
   at Microsoft.DotNet.Cli.Program.ProcessArgs(String[] args, ITelemetry telemetryClient)
   at Microsoft.DotNet.Cli.Program.Main(String[] args)

似乎'.dotnet'文件夹在Docker容器中受到保护。有没有办法获得对此的读写权限,或者改变它的位置? bash进入容器时,似乎找不到该文件夹​​。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

该问题似乎与尝试将数据写入Docker容器('/')的顶层有关。

在Jenkins文件中添加以下内容可确保设置主目录,并可以在具有正确权限的位置创建.dotnet文件夹。

environment {
   HOME = '/tmp'
} 

答案 1 :(得分:1)

您可以按照@colmulhall的建议设置HOME环境变量,然后将docker容器主目录设置为/tmp

要以"dotnet"的方式进行设置,请设置环境变量DOTNET_CLI_HOME

environment {
    DOTNET_CLI_HOME = "/tmp/DOTNET_CLI_HOME"
}

或在致电dotnet之前运行:

export DOTNET_CLI_HOME="/tmp/DOTNET_CLI_HOME"

答案 2 :(得分:1)

自定义Docker映像,对Jenkinsfile的更改最少

如果满足以下条件,则此选项很好。

  1. 您有多个Jenkinsfile项目都使用相同的docker映像。
  2. 您具有自定义的Nuget软件包源。

如果您使用的是自定义docker镜像,请基于dotnet sdk docker镜像。您可以使用以下命令创建一个Docker文件。

FROM mcr.microsoft.com/dotnet/core/sdk:2.2
WORKDIR /

# Setup default nuget.config, useful for custom nuget servers/sources
# Set Project-specific NuGet.Config files located in any folder from the solution folder up to the drive root. These allow control over settings as they apply to a project or a group of projects.
COPY nuget.config .

# Set the Environment Variable for the DOTNET CLI HOME PATH
ARG dotnet_cli_home_arg=/tmp/
ENV DOTNET_CLI_HOME=$dotnet_cli_home_arg

在与docker文件相同的目录中创建映像。

docker build -t jenkins-dotnet:latest .

为您要推送到的服务器设置标签。

docker tag jenkins-dotnet:latest some.docker.registry/jenkins-dotnet

将您的 jenkins-dotnet 图片推入

docker push some.docker.registry/jenkins-dotnet

然后您对所有项目的 Jenkinsfile 可能如下所示。

pipeline {
  agent {
    docker {
      image 'some.docker.registry/jenkins-dotnet'
      registryUrl 'https://some.docker.registry'
    }
  }
  stages {
    stage('Build') {
      steps {
        sh 'dotnet build MyApplication/Application.csproj -c Release -o /app'
      }
    }
    stage('Test') {
      steps {
        sh 'dotnet test MyApplication/Application.csproj -c Release -r /results'
      }
    }
  }
}