【问题标题】:How can I fix the permissions using docker on a bluemix volume?如何在 bluemix 卷上使用 docker 修复权限?
【发布时间】:2015-07-31 16:31:11
【问题描述】:

在容器中,我正在尝试启动 mysqld。

我能够创建映像并推送到注册表,但是当我想启动它时,/var/lib/mysql 卷无法初始化,因为我尝试在其上执行 chown mysql 并且不允许这样做。

我检查了 docker 特定的解决方案,但现在我无法进行任何工作。

有没有办法从 bluemix 为绑定安装的文件夹设置正确的权限? 或者是否支持 --volumes-from 选项,我似乎无法使其工作。

我现在能看到的唯一解决方案是以 root 身份运行 mysqld,但我宁愿不这样做。

试试 mount-bind

  1. 使用 cf ic volume create database 在 bluemix 上创建了一个卷
  2. 尝试在我的数据库容器上运行mysql_install_db 来初始化它的内容

    docker run --name init_vol -v database:/var/lib/mysql registry.ng.bluemix.net/<namespace>/<image>:<tag> mysql_install_db --user=mysql
    

mysql_install_db 应该填充/var/lib/mysql 并将权限设置为在--user 选项中设置的所有者,但我得到:

chown:更改“/var/lib/mysql”的所有权:权限被拒绝。

我还以不同的方式尝试了上述方法,使用 sudo 或脚本。我尝试使用mysql_install_db --user=root,它确实正确设置了我的文件夹,但它归root用户所有,我宁愿让mysql以mysql用户身份运行。

尝试使用volumes-from数据容器

  1. 我创建了一个带有卷 /var/lib/mysql 的数据容器

    docker run --name db_data -v /var/lib/mysql registry.ng.bluemix.net/<namespace>/<image>:<tag> mysql_install_db --user=mysql
    
  2. 我使用选项--volumes-from 运行我的数据库容器

    docker run --name db_srv --volumes-from=db_data registry.ng.bluemix.net/<namespace>/<image>:<tag> sh -c 'mysqld_safe & tail -f /var/log/mysql.err'
    

docker inspect db_srv 显示:

[{ "BluemixApp": null, "Config": { ..., "工作目录": "", ... } ... }]

cf ic logs db_srv 显示:

150731 15:25:11 mysqld_safe 使用来自的数据库启动 mysqld 守护进程 /var/lib/mysql 150731 15:25:11 [注意] /usr/sbin/mysqld (mysqld 5.5.44-0ubuntu0.14.04.1-log)从进程 377 开始 .. /usr/sbin/mysqld:找不到文件“./mysql-bin.index”(错误代码:13) 150731 15:25:11 [错误] 中止

这是由于 --volumes-from 不受支持,并且第一次创建的数据没有保留在第二次运行中。

【问题讨论】:

    标签: docker ibm-cloud


    【解决方案1】:

    在 IBM Containers 中,为 docker 引擎启用了用户命名空间。 “权限被拒绝”问题似乎是因为 NFS 不允许映射用户从容器执行操作。

    在我的本地设置中,在 docker 主机上,安装了一个 NFS(使用 no_root_squash 选项导出)。并使用 -v 选项将卷附加到容器。当容器是 从带有禁用用户命名空间的 docker 生成,我能够更改容器内绑定挂载的所有权。但是随着用户命名空间启用docker,我得到 chown: changing ownership of ‘/mnt/volmnt’: Operation not permitted

    cf (cf ic volume create ...) 创建的卷是 NFS,要验证只需从容器中尝试 mount -t nfs4。 何时为 docker 引擎启用用户命名空间。容器内有效的root是容器进程外的non-root用户,NFS不允许映射的非root用户对容器内的卷执行chown操作。

    这是解决方法,您可能想尝试

    1. 在 Dockerfile 中

      1.1 在安装 MySql 之前,使用 UID 1010 或任何空闲 ID 创建用户 mysql。 其他 Container 或新 Container 可以访问 UID 1010 的 Volume 上的 mysql 数据文件

      RUN groupadd --gid 1010 mysql

      RUN useradd --uid 1010 --gid 1010 -m --shell /bin/bash mysql

      1.2 安装MySqlL但不初始化数据库

      RUN apt-get update &amp;&amp; apt-get install -y mysql-server &amp;&amp; rm -rf /var/lib/mysql &amp;&amp; rm -rf /var/lib/apt/lists/*

    2. 在入口点脚本中

      2.1 在bind-mount下以mysql用户创建mysql数据目录,然后链接为/var/lib/mysql

      假设卷安装在容器内的/mnt/dbice run -v &lt;volume name&gt;:/mnt/db --publish 3306...cf ic run --volume &lt;volume name&gt;:/mnt/db ...)。 定义挂载路径环境变量

      MOUNTPATH="/mnt/db"

      将mysql添加到“root”组

      adduser mysql root

      设置挂载卷的权限,以便root 组成员可以创建目录和文件

      chmod 775 $MOUNTPATH

      在Volume下创建mysql目录

      su -c "mkdir -p /mnt/db/mysql" mysql

      su -c "chmod 700 /mnt/db/mysql" mysql

      将目录链接到 /var/lib/mysql

      ln -sf /mnt/db/mysql /var/lib/mysql

      chown -h mysql:mysql /var/lib/mysql

      从组root中删除mysql

      deluser mysql root

      chmod 755 $MOUNTPATH

      2.2 首次初始化数据库为用户mysql

      su -c "mysql_install_db --datadir=/var/lib/mysql" mysql

      2.3 以mysql用户身份启动mysql服务器

      su -c "/usr/bin/mysqld_safe" mysql

    【讨论】:

    • 我不明白,从你所说的这是 IBM 方面的设置,但我认为我无权访问 IBM Containers NFS 设置。您有什么建议或解决方法吗?我想我可以“只是”创建一个 NFS 容器并导出,然后安装在其他容器中,但我认为这不会给“-v”选项添加一个层。
    【解决方案2】:

    您在这里有多个问题。我会尝试解决一些问题。也许这会让你在正确的方向上更进一步。

    --volumes-from 在 IBM Containers 中尚不支持。您可以通过在第一个和后续容器上使用相同的 --volume (-v) 选项来解决此问题,而不是在第一个容器创建命令上使用 -v 并在后续容器上使用 --volumes-from。

    --user 选项也不被 IBM Containers 支持。

    我看到您使用 --user 的语法(我想在 localhost docker 上)不正确。 docker run 命令的所有选项都必须位于映像名称之前。图像名称之后的任何内容都被视为在容器内运行的命令。在这种情况下,“--user=mysql”将被视为系统将尝试运行并失败的命令。

    您分享的最后一条错误消息显示在工作目录中找不到某些文件导致应用程序中止。您可以通过使用脚本作为在将 dir 更改为正确位置的容器中运行的命令来解决此问题。

    【讨论】:

    • 所以你是说 -v /var/lib/mysql 将在我所有的容器之间持久化?或运行之间?或使用 -v database:/var/lib/mysql ? --user 选项是 mysql_install_db 的一个选项,它应该使用给定的 '--user' 选项初始化 /var/lib/mysql 中的内容。最后一个错误是缺少文件,因为第一次运行中的“mysql_install_db”填充了第一个容器中的/var/lib/mysql/,但是第二次运行中没有遵循数据,这与我从你的建议中理解的相反。
    • -v database:/var/lib/mysql 是应该与 IBM Containers 一起使用的语法。这样 /var/lib/mysql 数据实际上存储在“数据库”卷上。所以第二个容器在映射同一个卷时会看到数据,再次使用 -v database:/var/lib/mysql。
    • 这就是我一直在尝试的,但我不能在那里做一个“chown”,chown: changing ownership of '/var/lib/mysql': Permission denied。我还尝试针对特定文件,例如运行“touch /var/lib/mysql/testfile; chown mysql /var/lib/mysql/testfile”,结果相同。我还尝试将这些命令放入脚本中,无论是否使用 sudo。
    • 你能在你的 localhost docker 上运行那个容器并做 chown 吗?
    猜你喜欢
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 2019-05-08
    • 2021-01-04
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    相关资源
    最近更新 更多