Dotnet build permission denied in Docker container running Jenkins
The issue appeared to be linked to trying to write data to the top level of the Docker container ('/').
Adding the following to the Jenkinsfile ensures that the home directory is set and the .dotnet folder can be created in a location with correct permissions.
environment {
HOME = '/tmp'
}
You can set the HOME
environment variable as @colmulhall suggested, but then you will set the docker container home directory to /tmp
.
To do it in "dotnet"
way set the environment variable DOTNET_CLI_HOME
:
environment {
DOTNET_CLI_HOME = "/tmp/DOTNET_CLI_HOME"
}
Or before calling dotnet
run:
export DOTNET_CLI_HOME="/tmp/DOTNET_CLI_HOME"
Update
A sample Jenkins pipeline code taken from https://www.jenkins.io/doc/pipeline/tour/environment/
Look how DOTNET_CLI_HOME
is defined in the environment
section:
pipeline {
agent {
label '!windows'
}
environment {
DISABLE_AUTH = 'true'
DB_ENGINE = 'sqlite'
DOTNET_CLI_HOME = "/tmp/DOTNET_CLI_HOME"
}
stages {
stage('Build') {
steps {
echo "Database engine is ${DB_ENGINE}"
echo "DISABLE_AUTH is ${DISABLE_AUTH}"
sh 'printenv'
}
}
}
}
There are many ways to achieve this. If you are using docker, maybe a better way is defining the environment variable DOTNET_CLI_HOME
in the docker image.
Custom Docker Image, minimal changes to Jenkinsfile
This option is good if you have the following conditions.
- You have multiple Jenkinsfile projects all using the same docker image.
- You have custom Nuget package source.
If you are using a custom docker image, based off the dotnet sdk docker image. You can create a Docker file with the following.
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
Create your image in the same directory as your docker file.
docker build -t jenkins-dotnet:latest .
Set your tag for the server you want to push to.
docker tag jenkins-dotnet:latest some.docker.registry/jenkins-dotnet
Push your jenkins-dotnet image to
docker push some.docker.registry/jenkins-dotnet
Then your Jenkinsfile for all of the projects could be something as follows.
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'
}
}
}
}