20
votes

docker compose: Erreur lors du chargement des bibliothèques partagées: libz.so.1: impossible de mapper le segment à partir de l'objet partagé: opération non autorisée

Après avoir installé docker et docker-compose sur:

docker-compose version 1.25.0-rc2, build 661ac20e

Lors de l'exécution:

sudo docker-compose -version

Il renvoie:

Error while loading shared libraries: libz.so.1: failed to map segment from shared object: Operation not permitted

Il devrait renvoyer:

NAME="Red Hat Enterprise Linux Server"
VERSION="7.6 (Maipo)"

L'installation à partir de docker-compose est la suivante


0 commentaires

3 Réponses :


45
votes

Je l'ai résolu en remontant le / tmp pour donner au volume la permission de s'exécuter (il était accessible en lecture seule). Donc, cela résolu:

sudo mount /tmp -o remount,exec


2 commentaires

A travaillé pour moi aussi.


Bien qu'il s'agisse d'une solution de contournement valide, elle ne doit pas être la réponse préférée car elle n'est pas sécurisée. Si le système que vous utilisez a été renforcé, le montage /tmp sera défini sur noexec (et probablement aussi sur nodev et nosuid ). Le remonter avec exec activé va à l'encontre de l'objectif de sécurisation de cette monture. Voir les benchmarks CIS pour plus de détails sur les raisons pour lesquelles cela est fait.



13
votes

La configuration d'un répertoire TMPDIR spécifique à l'utilisateur résout le problème. La variable d'environnement TMPDIR est la norme POSIX, mais TMP (et quelques autres) peut également être généralement acceptée.

D'autres réponses expliquent comment configurer le répertoire temporaire global par défaut. Voici deux exemples pour savoir si la politique de sécurité du système n'autorise pas /tmp à être exécutable.

Premier exemple de solution

alias docker-compose="TMPDIR=${HOME}/tmp docker-compose"

Pour plus de commodité, une fois le répertoire créé, l'instruction "export" peut être placée dans la configuration du profil du shell (exemple: ~/.bash_profile ou ~/.bashrc ).

Deuxième exemple de solution

Configurez un alias (fichiers d'exemple: ~/.bashrc ou ~/.bash_alias ).

mkdir $HOME/tmp
export TMPDIR=$HOME/tmp
docker-compose --version

C'est un problème qui semble être un point d'achoppement courant. Certaines recherches montrent qu'il peut être lié à PyInstaller et non spécifiquement à docker-compose.


4 commentaires

docker fonctionne déjà en tant que root, donc $ HOME / tmp pointe simplement vers / root / tmp, ce qui est la cause du problème car il n'a pas le drapeau exec, je ne veux pas gâcher la sécurité de mon système. J'ai donc fait mkdir / root / docker_temp et défini export TMPDIR = / root / docker_temp et cela a fonctionné, mais je me demande comment et qui va nettoyer toutes les données dans ce dossier car il ne se comporte pas comme le vrai tmp. des idées là-dessus?


@OAH, D'après mon expérience, faire presque tout ce qui est "normal" en tant qu'utilisateur root est une mauvaise idée. Au lieu de cela, recherchez des alternatives comme sudo ou dans le cas de Docker, en donnant à un utilisateur régulier le groupe docker . Par exemple, si mon utilisateur est kevin , alors sudo usermod -a -G docker kevin ajouterait le groupe docker à ma liste de groupes. Cela peut être vérifié avec les groups kevin .


@OAH, à ce stade, nous devrions probablement déplacer cela vers une nouvelle question. Il semble que vous ayez perdu que le problème ici n'est pas docker, mais docker-compose et la façon dont il est emballé. docker-compose est un programme python qui utilise PyInstaller pour l'empaqueter afin de faciliter son utilisation. PyInstaller a besoin d'un espace tmp pour décompresser et exécuter certaines choses afin que docker-compose fonctionne. PyInstaller doit toujours nettoyer après lui-même. En regardant le répertoire tmp de ma machine, et il n'y a jamais rien laissé derrière.


@OAH, un autre mot d'avertissement. L'exportation de TMPDIR le mettra dans l'environnement pour chaque commande exécutée à partir de ce shell. Cela signifie que, dans votre exemple, chaque commande utilisera /root/tmp_alternative pour l'espace tmp. Tous les programmes ne peuvent pas nettoyer après eux, c'est donc quelque chose dont il faut être conscient.



0
votes

J'ai eu le même problème et les deux exemples de solution de Kevin fonctionnent pour moi, voici ce que j'ai fait:

  • Je fais ce que Kevin a dit et j'ai mis export TMPDIR=$HOME/tmp sur le fichier ~/.bashrc

0 commentaires