主机和Docker容器之间的卷和权限

时间:2019-09-04 15:53:41

标签: docker permissions volumes

我正在尝试对主机上的所有服务进行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-mysqlUSER docker-mysql来将docker容器的用户更改为另一个用户,但是mysql容器甚至无法启动,因为docker-mysql用户似乎没有root权限。我也在Gitlab-CE docker映像上尝试过此操作,但是遇到了另一个问题,即以其他用户身份运行Gitlab-CE会引发权限错误。

是否知道如何以正确的用户将文件写入主机上的/data/mysql例如?

1 个答案:

答案 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(这是一本好书)