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

Volumes and permissions between host and docker container

我正在尝试 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 和组 root 在 /data/mysql 文件夹中创建。

我要实现的目标是 /data/mysql 文件夹中的文件将作为 docker-mysql 用户而不是根用户创建。

我试图通过设置 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 吗?

尽管有您的 mysql 映像,您需要的是:容器内的每个进程都必须以非根用户身份执行。有一些解决方法,但我建议您首先深入研究 mysql 基本图像,看看幕后发生了什么。一种方法是 将每个进程重定向到非根用户 。这可以通过以下方式实现:

在你的 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 上,需要修改 如果图像与此示例不同(它来自mongodb 使用 ubuntu 作为 OS 基本图像) :

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(读起来不错)