web-dev-qa-db-fra.com

Dockerfile réplique l'UID et le GID de l'utilisateur hôte sur l'image

Similaire à SO post sur la réplication UID/GID dans le conteneur de l'hôte mais comment construire l'image avec un utilisateur avec UID et GID répliqués? De préférence, comment faites-vous avec un dockerfile?

Je peux le faire avec un script bash:

#!/bin/bash

# current uid and gid
curr_uid=`id -u`
curr_gid=`id -g`

# create bb.dockerfile:
cat << EOF1 > bb.dockerfile
 FROM ubuntu:xenial-20170214
 ARG UNAME=testuser
EOF1

 echo ARG UID=${curr_uid} >> bb.dockerfile
 echo ARG GID=${curr_gid} >> bb.dockerfile

cat << EOF2 >> bb.dockerfile
 RUN groupadd -g \$GID \$UNAME
 RUN useradd -m -u \$UID -g \$GID -s /bin/bash \$UNAME
 USER \$UNAME
 CMD /bin/bash
EOF2

docker build -f bb.dockerfile -t testimg .

Cette bash générera un fichier docker comme suit et s'appuiera dessus.

 FROM ubuntu:xenial-20170214
 ARG UNAME=testuser
 ARG UID=1982
 ARG GID=1982
 RUN groupadd -g $GID $UNAME
 RUN useradd -m -u $UID -g $GID -s /bin/bash $UNAME
 USER $UNAME
 CMD /bin/bash

Ce que je demande, c'est de supprimer l'hôte UID 1982 et le GID 1982 codés en dur du dockerfile.

17
minghua

Vous pouvez le passer comme argument de build. Votre Dockerfile peut être statique:

FROM ubuntu:xenial-20170214
ARG UNAME=testuser
ARG UID=1000
ARG GID=1000
RUN groupadd -g $GID -o $UNAME
RUN useradd -m -u $UID -g $GID -o -s /bin/bash $UNAME
USER $UNAME
CMD /bin/bash

Ensuite, vous passeriez les options sur votre commande de génération:

docker build --build-arg UID=$(id -u) --build-arg GID=$(id -g) \
  -f bb.dockerfile -t testimg .

Notez que j'ai résolu des problèmes similaires à cela d'une manière différente, en exécutant un point d'entrée en tant que racine qui ressemble à un fichier/répertoire des autorisations du montage de volume hôte, et ajustez l'uid/gid des utilisateurs à l'intérieur du conteneur pour correspondre à l'uid du volume/gid. Après avoir effectué cette modification, il supprime l'accès de l'utilisateur root à l'utilisateur uid/gid modifié et exécute la commande/le point d'entrée d'origine. Le résultat est que l'image peut être exécutée inchangée sur n'importe quelle machine de développeur. Un exemple de cela peut être trouvé dans mon repo jenkins-docker:

https://github.com/Sudo-bmitch/jenkins-docker

32
BMitch

Finalement, le bb.bash ressemble à:

#!/bin/bash

# current uid and gid
curr_uid=`id -u`
curr_gid=`id -g`

# create bb.dockerfile:
cat << EOF2 > bb.dockerfile
 FROM ubuntu:xenial-20180417
 ARG UNAME=testuser
 ARG UID=1000
 ARG GID=1000
 RUN groupadd -g \$GID \$UNAME
 RUN useradd -m -u \$UID -g \$GID -s /bin/bash \$UNAME
 USER \$UNAME
 CMD /bin/bash
EOF2    

docker build --build-arg UID=${curr_uid} --build-arg GID=${curr_gid} \
    -f bb.dockerfile -t testimg .

Ensuite, un autre script consiste à créer le conteneur:

#!/bin/bash

docker run -it -d -v $(pwd)/shared:/home/testuser/shared \
    --name testcontainer -P testimg
0
minghua