Docker 卷的权限问题
Permissions issue with Docker volumes
我想开始使用 Docker 进行我的 Rails 开发,所以我正在尝试组合一个 skeleton 我可以用于我的所有应用程序。
但是,我 运行 遇到了 Docker 卷和权限的问题。
我想将应用程序的目录绑定挂载到容器中,这样任何更改都可以传播到容器中,而无需重新构建它。
但是如果我在 docker-compose.yml
中将它定义为一个卷,我就不能再 chown
该目录了。我需要 app
用户拥有该目录及其所有内容,以便 Passenger 正常工作。
我了解到无法 chown
卷。
您知道任何解决方法吗?
您可以尝试 运行 chown
而不是 CMD
。喜欢:
CMD chown -R app:app /home/app/webapp && /sbin/my_init
RUN
语句仅在映像构建期间执行。但是你还没有安装卷。
CMD
而不是在卷已安装的容器的 运行 时间内执行。这样就会有你想要的效果。
我使用 hacky 解决方案 来解决我的开发环境中的这个问题。 仅在开发环境中使用!
我用于开发环境的图像包含如下所示的脚本:
#!/bin/sh
# In usr/local/bin/change-dev-id
# Change the "dev" user UID and GID
# Retrieve new ids to apply
NEWUID=
NEWGID=
if [ $# -eq 2 ]
then
NEWGID=
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")或修改它以将用户名作为参数传递。
我想开始使用 Docker 进行我的 Rails 开发,所以我正在尝试组合一个 skeleton 我可以用于我的所有应用程序。
但是,我 运行 遇到了 Docker 卷和权限的问题。
我想将应用程序的目录绑定挂载到容器中,这样任何更改都可以传播到容器中,而无需重新构建它。
但是如果我在 docker-compose.yml
中将它定义为一个卷,我就不能再 chown
该目录了。我需要 app
用户拥有该目录及其所有内容,以便 Passenger 正常工作。
我了解到无法 chown
卷。
您知道任何解决方法吗?
您可以尝试 运行 chown
而不是 CMD
。喜欢:
CMD chown -R app:app /home/app/webapp && /sbin/my_init
RUN
语句仅在映像构建期间执行。但是你还没有安装卷。
CMD
而不是在卷已安装的容器的 运行 时间内执行。这样就会有你想要的效果。
我使用 hacky 解决方案 来解决我的开发环境中的这个问题。 仅在开发环境中使用!
我用于开发环境的图像包含如下所示的脚本:
#!/bin/sh
# In usr/local/bin/change-dev-id
# Change the "dev" user UID and GID
# Retrieve new ids to apply
NEWUID=
NEWGID=
if [ $# -eq 2 ]
then
NEWGID=
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")或修改它以将用户名作为参数传递。