2015-07-29 1 views
3

Я хочу начать использовать Docker для разработки Rails, поэтому я пытаюсь собрать skeleton, который я могу использовать для всех своих приложений.Разрешения с объемами докеров

Однако у меня возникла проблема с томами и разрешениями Docker.

Я хочу привязать каталог приложения к контейнеру, чтобы любые изменения распространялись на контейнер без необходимости его повторной сборки.

Но если я определяю его как том в своем docker-compose.yml, я больше не могу chown в каталоге. Мне нужно, чтобы каталог и все его содержимое принадлежали пользователю app, чтобы Пассажир работал правильно.

Я читал, что это невозможно для chown томов.

Знаете ли вы об этом?

ответ

3

Я использую 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») или изменить его, чтобы передать имя пользователя в качестве аргумента.

+1

Что делать, если я хочу распространять это публично (как я пытаюсь сделать)? Я должен попросить разработчиков установить свой собственный UID и GID в Dockerfile, что не кажется очень удобным. –

+0

Да, это решение не очень удобно, если вы планируете распространять это публично. Это может быть приемлемо, если вы действительно контролируете среду разработки. –

4

Вместо этого вы можете попытаться запустить chown вместо CMD. Например:

CMD chown -R app:app /home/app/webapp && /sbin/my_init 

RUN заявления выполняются только в течение встроенного времени вашего изображения. Но у вас еще нет смонтированных томов.

CMD вместо этого выполняется во время работы контейнера, когда тома уже установлены. Так что это будет иметь эффект, который вы хотите.

 Смежные вопросы

  • Нет связанных вопросов^_^