Docker卷的权限问题

3

我想开始使用Docker进行我的Rails开发,所以我正在尝试组合一个框架,我可以在所有应用程序中使用。

但是,我遇到了Docker卷和权限的问题。

我想将应用程序的目录绑定到容器中,这样任何更改都会传播到容器中,而无需重新构建它。

但是,如果我在docker-compose.yml中将其定义为卷,我就无法再chown该目录。我需要该目录及其所有内容都归app用户所有,以便Passenger能够正确工作。

我读到说无法chown卷。

你知道有什么解决方法吗?

2个回答

4

您可以尝试通过CMD运行chown命令。例如:

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

RUN语句仅在构建镜像时执行,但此时您尚未挂载卷。

CMD语句在容器运行时执行,此时卷已经被挂载。因此,这将产生您想要的效果。


3

我使用了一个“hacky solution”来管理我的开发环境中的这个问题。只能在开发环境中使用!

我用于开发环境的映像包含一个脚本,看起来像这样:

#!/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

接着,我并没有改变已挂载文件夹的所有者,而是将容器用户的ID更改为与我的主机用户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
如果我想公开分发这个(正如我正在尝试做的那样),该怎么办?我必须要求开发人员在Dockerfile中设置他们自己的UID和GID,这似乎不是很方便。 - Alessandro Desantis
是的,如果您计划公开分发此解决方案,则这种解决方案并不真正方便。如果您确实控制开发环境,则可能是可以接受的。 - Alexis N-o

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接