2 votes

Docker container ubuntu 21 Root to Root (machine locale vers container) donne des problèmes de permission sur les sauvegardes de fichiers

Je viens de commencer à utiliser Docker car on me l'a recommandé pour faciliter le développement, mais jusqu'à présent, ce n'est rien d'autre que de la souffrance. J'ai installé docker engine (v20.10.12) y docker composer (v 2.2.3) selon la documentation donnée par docker pour Ubuntu OS. Les deux fonctionnent comme prévu.

Chaque fois que je crée un nouveau conteneur avec docker compose Peu importe la source, j'ai des problèmes de privilèges d'écriture sur les fichiers générés par le conteneur docker (par exemple une application Laravel où j'ai utilisé php artisan pour créer un fichier contrôleur). Jusqu'à présent, j'ai identifié le problème comme étant le suivant :

Par défaut, docker s'exécute en tant que Root dans le conteneur. Il fait le "pont" entre l'utilisateur Root et l'utilisateur Root sur la machine locale et utilise root:root pour créer des fichiers sur le système de fichiers Ubuntu (mon espace de travail est placé dans le répertoire ~/workspace/laravel ). Ensuite, lorsque vous ouvrez les fichiers dans un IDE ( vscode dans ce cas) je reçois l'erreur :

Failed to save to '<file_name>': insufficient permissions. Select 'Retry as Sudo' to retry as superuser

Si j'essaie d'analyser mon propre utilisateur local dans la machine et que je lui demande d'utiliser cet identifiant et ce groupe spécifiques, tout va bien si j'utilise le premier utilisateur créé sur la machine ( 1000:1000 ) puisque cela correspondra à l'utilisateur par défaut des conteneurs si nous regardons le fichier bitnami/laravel image docker par exemple.

Tout cela peut être corrigé en exécutant chown -R yadayada . sur le répertoire de l'espace de travail à chaque fois que j'utilise php artisan pour créer un fichier. Mais je ne pense pas que cela soit durable ou intelligent de quelque manière que ce soit.

Comment puis-je dire à mon conteneur Docker de vérifier, au démarrage, si un utilisateur avec mon nom d'utilisateur et mon mot de passe a été sélectionné ? UID y GID existe et si ce n'est pas le cas, créer un utilisateur avec cet identifiant et l'assigner comme utilisateur du système ?

Mon docker-compose.yml pour cet exemple

version: '3.8'

services:
  api_php-database:
    image: postgres
    container_name: api_php-database
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: laravel_docker
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    ports:
      - '5432:5432'
  api_php-apache:
    container_name: api_php-apache
    build:
      context: ./php
    ports:
      - '8080:80'
    volumes:
      - ./src:/var/www/laravel_docker
      - ./apache/default.conf:/etc/apache2/sites-enabled/000-default.conf
    depends_on:
      - api_php-database

Mon Dockerfile pour cet exemple

FROM php:8.0-apache

RUN apt update && apt install -y g++ libicu-dev libpq-dev libzip-dev zip zlib1g-dev && docker-php-ext-install intl opcache pdo pdo_pgsql pgsql

WORKDIR /var/www/laravel_docker

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

1voto

qqNade Points 890

En général, ce n'est pas possible, mais il existe des solutions de contournement (je ne les recommande pas pour la production). L'UID du superutilisateur est toujours 0, ceci est écrit dans le code du noyau. Il n'est pas possible de changer automatiquement la propriété des fichiers non-Root. Dans ce cas, lors du développement, vous pouvez utiliser ces méthodes :

Si les droits de superutilisateur ne sont pas requis : Vous pouvez créer des utilisateurs de façon dynamique, alors docker-compose.yml :

version: "3.0"
services:
  something:
    image: example-image
    volumes:
      - /user/path1:/container/path1
      - /user/path2:/container/path2
    # The double $ is needed to indicate that the variable is in the container
    command: ["bash", "-c", "chown -R $$HOST_UID:$$HOST_GID /container/path1 /container/path2; useradd -g $$HOST_GID -u $$HOST_UID user; su -s /bin/bash user"]
    environment:
      HOST_GID: 100
      HOST_UID: 1000

Sinon, si vous exécutez des commandes dans un conteneur comme Root dans Bash : Bash exécutera le script de la variable PROMPT_COMMAND après l'exécution de chaque commande. Ceci peut être utilisé en développement en modifiant docker-compose.yaml :

version: "3.0"
services:
  something:
    image: example-image
    volumes:
      - /user/path1:/container/path1
      - /user/path2:/container/path2
    command: ["bash"]
    environment:
      HOST_UID: 1000
      HOST_GID: 100
      # The double $ is needed to indicate that the variable is in the container
      PROMPT_COMMAND: "chown $$HOST_UID:$$HOST_GID -R /container/path1 /container/path2"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X