Я использую hacky-решение для решения этой проблемы в моей среде разработки. Для использования только в среде разработки!
Изображение, которые я использую для среды разработки содержит скрипт, который выглядит следующим образом:
#!/bin/sh
# In usr/local/bin/change-dev-id
# Change the "dev" user UID and GID
# Retrieve new ids to apply
NEWUID=$1
NEWGID=$1
if [ $# -eq 2 ]
then
NEWGID=$2
elif [ $# -ne 1 ]
then
echo "Usage: change-dev-id NEWUID [NEWGID]"
echo "If NEWGID is not provided, its value will be the same as NEWUID"
exit 1
fi
# Retrieve old ids
OLDUID=`id -u dev`
OLDGID=`id -g dev`
# Change the user ids
usermod -u ${NEWUID} dev
groupmod -g ${NEWGID} dev
# Change the files ownership
find/-not \(-path /proc -prune \) -user ${OLDUID} -exec chown -h ${NEWUID} {} \;
find/-not \(-path /proc -prune \) -group ${OLDGID} -exec chgrp -h ${NEWGID} {} \;
echo "UID and GID changed from ${OLDUID}:${OLDGID} to ${NEWUID}:${NEWGID} for \"dev\""
exit 0
В Dockerfile моего основным образа, я добавляю его и сделать его исполняемым:
# Add a script to modify the dev user UID/GID
COPY change-dev-id /usr/local/bin/change-dev-id
RUN chmod +x /usr/local/bin/change-dev-id
Тогда вместо изменения владельца прикрепленной папки я изменяю идентификатор пользователя контейнера в соответствии с идентификатором моего пользователя на главной машине:
# In the Dockerfile of the project's development environment, change the ID of
# the user that must own the files in the volume so that it match the ID of
# the user on the host
RUN change-dev-id 1234
Это очень хаки, но это может быть очень удобно. Я могу хранить файлы проекта на своей машине, в то время как пользователь в контейнере имеет правильные разрешения.
Вы можете обновить код сценария, чтобы использовать имя пользователя, которое вы хотите (мое всегда «dev») или изменить его, чтобы передать имя пользователя в качестве аргумента.
Что делать, если я хочу распространять это публично (как я пытаюсь сделать)? Я должен попросить разработчиков установить свой собственный UID и GID в Dockerfile, что не кажется очень удобным. –
Да, это решение не очень удобно, если вы планируете распространять это публично. Это может быть приемлемо, если вы действительно контролируете среду разработки. –