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.
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:
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