【问题标题】:Volumes and permissions between host and docker container主机和 docker 容器之间的卷和权限
【发布时间】:2020-01-07 13:27:24
【问题描述】:

我正在尝试对我的主机上的所有服务进行 dockerize。但是我在 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 上运行,这些备份在 /data/mysql 文件夹中以用户 root 和组 root 的身份创建。

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

我试图通过设置RUN groupadd -r docker-mysql && useradd -r -g docker-mysql docker-mysqlUSER docker-mysql将docker容器的用户更改为另一个用户,但是mysql容器甚至不再启动,因为docker-mysql用户似乎没有根权限。我也在 Gitlab-CE docker 映像上尝试过这个,但遇到了同样的问题,即以不同的用户身份运行 Gitlab-CE 会引发权限错误。

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

【问题讨论】:

  • 你用的是哪个mysql镜像?

标签: docker permissions volumes


【解决方案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(读起来不错)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-19
    • 2021-07-18
    • 2021-03-01
    • 2022-01-27
    • 2021-05-12
    • 2017-06-30
    • 1970-01-01
    • 2014-11-03
    相关资源
    最近更新 更多