2017-08-05 1 views
1

J'ai une image de conteneur docker OpenSuse 42.3 que j'ai créée avec un seul utilisateur, que nous appellerons 'streamuser'. Je voudrais que ce soit l'utilisateur qui est actif chaque fois que quelqu'un crée un conteneur à partir de mon image. J'ai monté le répertoire personnel de l'hôte dans le répertoire home de streamuser. Le problème que j'ai, c'est que si je lance le conteneur Docker sur un hôte Linux, streamusercan n'écrit rien dans les répertoires de l'hôte. Cela est dû au fait que streamuser ne partage pas les mêmes UID et GID que l'hôte. Existe-t-il un moyen propre de résoudre ce problème qui m'évite de définir le compte d'utilisateur par défaut dans l'image sur le compte root? Si je me connecte en tant que root dans le conteneur, je peux écrire sur l'hôte Linux, mais cela n'est pas souhaitable.Autoriser un utilisateur non root à écrire sur l'hôte Linux dans Docker

Mon appel docker est:

docker run -it -d --name ${containerName} --user="streamuser"   \ 
    --workdir="/home/streamuser" --volume="${home}:/home/streamuser" \ 
    ${imageName} /bin/bash -rcfile /opt/Codebase/image_env_setup_v206.sh 

Je l'ai vu une solution où quelqu'un a utilisé l'option --volume comme passé le passwd hôte, sudoers, fichiers etc jusqu'à conteneur. Je n'aime pas cette option car elle écrase mon environnement créé dans le conteneur, et il me semble que c'est une solution bidouille.

Mon dockerfile est:

FROM opensuse:42.3 

RUN zypper update -y && \ 
    zypper install -y \ 
    sudo \ 
    vim \ 
    gcc-fortran \ 
    infinipath-psm-devel \ 
    openmpi \ 
    openmpi-devel \ 
    openmpi-libs \ 
    hdf5-openmpi \ 
    blas-devel \ 
    blas-devel-static \ 
    lapack-devel \ 
    which 

RUN echo "root:streamuser_2017" | chpasswd 
RUN useradd -m streamuser 
RUN passwd -d streamuser 
CMD /bin/bash 

RUN mkdir -p -m0755 \ 
    /opt/codeA/lib \ 
    /opt/codeA/bin \ 
    /opt/codeB/lib \ 
    /opt/codeC/lib \ 
    /opt/codeC/bin \ 
    /opt/petsc/lib 

USER streamuser 
WORKDIR /home/streamuser 

RUN source $HOME/.bashrc 

COPY ./Docker/critical_dependencies/codeA_lib/* /opt/codeA/lib/ 
COPY ./Docker/critical_dependencies/codeA_bin/* /opt/codeA/bin/ 
COPY ./Docker/critical_dependencies/codeB_lib/* /opt/codeB/lib/ 
COPY ./Docker/critical_dependencies/petsc_lib/* /opt/petsc/lib/ 
COPY ./lib/* /opt/codeC/lib/ 
COPY ./bin/* /opt/codeC/bin/ 
COPY ./Docker/image_env_setup_v206.sh /opt/codeC 

RUN source /opt/codeC/image_env_setup_v206.sh 
+0

Que diriez-vous de changer le Gid de streamuser à l'intérieur du conteneur pour appartenir à un groupe racine dans le conteneur? – Ayushya

+0

@Ayushya J'avais pensé à faire cela, mais je crois que c'est généralement d'ajouter des utilisateurs au groupe racine. – wandadars

+1

Vrai, j'ai proposé cette solution, mais même je suis d'accord avec "l'utilisateur ne devrait pas être ajouté au groupe racine" – Ayushya

Répondre

2

Vous pouvez ajouter fixuid (par Caleb Lloyd) dans votre image Dockerfile.
Voir moby/moby issue 7198:

We have created a workaround for this issue that changes a Docker container's user/group and file permissions that were set at build time to the UID/GID that the container was started with at runtime.

The project and install instructions are at: https://github.com/boxboat/fixuid

Example:

  • Docker container was built using user/group dockeruser:dockergroup as UID/GID 1000:1000 .
  • Host is running as UID/GID 1001:1002 .
  • Image is run with docker run -u 1001:1002 .

fixuid will:

  • change dockeruser UID to 1001
  • change dockergroup GID to 1002
  • change all file permissions for old dockeruser:dockergroup to 1001:1002
  • update $HOME inside container to dockeruser $HOME
  • now container and host UID/GID match and files created in the container on host mounts will match.

It can run as the ENTRYPOINT or as part of a startup script. It is installed in the container as a binary owned by root with the setuid bit, and escalates privileges to make the appropriate changes. It should only be used in development containers.

+0

Cela ressemble à une bonne solution. Étape 2 des instructions dans le repo Github échoue pour moi avec l'erreur: tar: fixuid: Impossible d'ouvrir: Autorisation refusée tar: Fermeture avec état d'échec en raison d'erreurs précédentes. Dans les instructions pour l'étape 2, il est dit que la commande doit être exécutée en tant que root, mais je ne suis pas vraiment sûr de la façon dont je peux garantir que cette commande particulière sera exécutée en tant que root dans mon Dockerfile. – wandadars

+1

@wandadars il peut, si vous ajoutez USER root juste avant le RUN – VonC

+0

fixuid a fonctionné parfaitement. Merci @VonC. – wandadars