J'ai une machine virtuelle hébergeant Oracle Linux sur laquelle j'ai installé Docker et créé des conteneurs à l'aide d'un fichier docker-compose. J'ai placé le volume jenkins dans un dossier partagé, mais lors du démarrage du docker-compos up, le message d'erreur suivant s'affiche pour Jenkins:
jenkins | touch: ne peut pas toucher ‘/var/jenkins_home/copy_reference_file.log’: autorisation refusée jenkins | Impossible d'écrire dans /var/jenkins_home/copy_reference_file.log. Mauvaises autorisations de volume? Jenkins est sorti avec le code 1
Voici la déclaration des volumes
volumes:
- "/media/sf_devops-workspaces/dev-tools/continuous-integration/jenkins:/var/jenkins_home"
Le problème est que votre utilisateur dans le conteneur a un ID utilisateur différent: groupid en tant qu'utilisateur sur l'hôte.
vous avez deux possibilités:
Vous pouvez vous assurer que l'utilisateur du conteneur a le même ID utilisateur: ID de groupe, comme l'utilisateur de l'hôte, qui a accès au volume monté. Pour cela, vous devez ajuster l'utilisateur dans le fichier Docker. Créez un utilisateur dans le fichier docker avec le même ID utilisateur: ID groupe, puis basculez vers cet utilisateur https://docs.docker.com/engine/reference/builder/#user
Vous pouvez vous assurer que l'utilisateur sur l'hôte a le même ID utilisateur: ID groupe, comme l'utilisateur du conteneur. Pour cela, entrez le conteneur avec docker exec -it <container-name> bash
et affichez l'ID utilisateur id -u <username>
l'ID groupe id -G <username>
. Modifiez les autorisations du volume monté sur cet ID utilisateur: ID groupe.
Comme haschibaschi a déclaré, votre utilisateur dans le conteneur a un ID utilisateur différent: identificateur de groupe que l'utilisateur sur l'hôte.
Pour contourner ce problème, vous devez démarrer le conteneur sans le mappage de volume (problématique), puis exécutez bash sur le conteneur:
docker run -p 8080:8080 -p 50000:50000 -it jenkins bin/bash
Une fois dans le shell du conteneur, exécutez la commande id et vous obtiendrez des résultats tels que:
uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins)
Quittez le conteneur, allez dans le dossier que vous essayez de mapper et exécutez:
chown -R 1000:1000 .
Avec les autorisations qui correspondent maintenant, vous devriez pouvoir exécuter la commande d'origine de docker avec le mappage de volume.
La solution de facilité consiste à utiliser le paramètre -u. Gardez à l'esprit que cela fonctionnera en tant qu'utilisateur root (uid = 0)
docker run -u 0 -d -p 8080:8080 -p 50000:50000 -v /data/jenkins:/var/jenkins_home jenkins/jenkins:lts
Cette erreur résout en utilisant le commnad suivant.
allez à votre chemin de montage de données Jenkins:/media
Exécutez la commande suivante:
cd /media
Sudo chown -R ubuntu:ubuntu sf_devops-workspaces
redémarrer le conteneur docker jenkins
docker-compose restart jenkins