我正在尝试对主机上的所有服务进行docker化。但是我遇到了以下有关Docker以及主机与Docker之间的卷权限的问题。
我有一台具有以下文件夹结构的主机:
- /data/mysql (user: docker-mysql)
- /data/gitlab (user: docker-gitlab)
- /data/backup (user: share-backup)
/data/mysql:/mnt/mysql
文件夹已挂载到mysql docker容器中。 docker mysql容器每24小时创建一次备份,但是由于docker容器在root用户上运行,因此这些备份将以root用户和group root的身份在/ data / mysql文件夹中创建。
我要实现的目标是/ data / mysql文件夹中的文件将以docker-mysql用户而不是root用户身份创建。
我尝试通过设置RUN groupadd -r docker-mysql && useradd -r -g docker-mysql docker-mysql
和USER docker-mysql
来将docker容器的用户更改为另一个用户,但是mysql容器甚至无法启动,因为docker-mysql
用户似乎没有root权限。我也在Gitlab-CE docker映像上尝试过此操作,但是遇到了另一个问题,即以其他用户身份运行Gitlab-CE会引发权限错误。
是否知道如何以正确的用户将文件写入主机上的/data/mysql
例如?
答案 0 :(得分:1)
尽管有mysql映像,但您需要的是:容器中的每个进程都必须以非root用户身份执行。有一些解决方法,但是我建议您首先深入了解mysql基本映像,看看幕后发生了什么。一种方法是将每个进程重定向到非root用户。这可以通过以下方式实现:
在您的Dockerfile上
RUN groupadd -r docker-mysql && useradd -r -g docker-mysql docker-mysql
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["mysqld"] ##CHECK YOUR IMAGE FIRST
这两个可以翻译为
docker-entrypoint.sh mysqld
现在在您的docker-entrypoint.sh上,如果映像与此示例不同(它来自使用 ubuntu作为操作系统基础映像的mongodb,则需要修改) ):
if [[ “$originalArgOne” == mysql* ]] && [ “$(id -u)” = ‘0’ ]; then
if [ “$originalArgOne” = ‘mysqld’ ];
then chown -R docker-mysql <MYSQL FOLDERS in CONTAINER>
fi
# make sure we can write to stdout and stderr as “mongodb”
# (for our “initdb” code later; see “ — logpath” below)
chown --dereference docker-mysql “/proc/$$/fd/1” “/proc/$$/fd/2” || :
exec gosu docker-mysql “$BASH_SOURCE” “$@”
fi
这个答案刚改编自here(这是一本好书)