Docker卷的权限问题

时间:2015-07-29 16:44:06

标签: docker docker-compose

我想开始使用Docker进行Rails开发,所以我正在尝试整理一个skeleton我可以用于我的所有应用程序。

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

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

但如果我在docker-compose.yml中将其定义为一个卷,我就不能chown该目录了。我需要目录及其所有内容归app用户所有,以便Passenger正常工作。

我读到chown卷不可能。

您知道有任何变通方法吗?

2 个答案:

答案 0 :(得分:4)

您可以尝试通过chown来运行CMD。像:

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

RUN语句仅在图像构建期间执行。但是,你还没有安装卷。

CMD代替在容器运行时在已安装卷时执行。这样会产生你想要的效果。

答案 1 :(得分: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

然后,我不是更改已安装文件夹的所有者,而是更改容器用户的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

这非常hacky但它​​可以非常方便。 我可以在我的机器上拥有项目的文件,而容器中的用户也拥有正确的权限。

您可以更新脚本代码以使用您想要的用户名(我的总是" dev")或修改它以将用户名作为参数传递。