如何在bluemix卷上使用docker修复权限?

时间:2015-07-31 16:31:12

标签: docker ibm-cloud

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

我能够创建一个图像并推送到注册表,但是当我想启动它时,/var/lib/mysql卷无法初始化,因为我尝试对其进行chown mysql这是不允许的。

我查看了特定于码头的解决方案,但现在我无法做任何工作。

有没有办法在bluemix上为绑定挂载的文件夹设置正确的权限?或支持选项--volumes-from,我似乎无法使其正常工作

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

尝试使用mount-bind

  1. 使用cf ic volume create database
  2. 在bluemix上创建了一个卷
  3. 尝试在我的数据库容器上运行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
    
  4. mysql_install_db应该填充/var/lib/mysql并设置--user选项中所有者设置的权限,但我得到:

      

    chown:更改&#39; / var / lib / mysql的所有权&#39;:权限被拒绝。

    我也使用sudo或脚本以不同的方式尝试了上述方法。我尝试使用mysql_install_db --user=root,它确实正确设置了我的文件夹,除了它由root用户拥有,我宁愿让mysql作为mysql用户运行。

    尝试使用卷 - 来自数据容器

    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'
      
    3. docker inspect db_srv显示:

        

      [{&#34; BluemixApp&#34;:null,&#34; Config&#34;:{       ...       &#34; WorkingDir&#34;:&#34;&#34;,       ......} ...}]

      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:File&#39; ./ mysql-bin.index&#39;找不到(错误代码:13)   150731 15:25:11 [错误]中止

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

2 个答案:

答案 0 :(得分:3)

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

在我的本地设置中,在docker主机上安装了一个NFS(使用no_root_squash选项导出)。并使用-v选项将卷附加到容器。当容器是 从具有禁用用户命名空间的docker生成,我能够更改容器内bind-mount的所有权。但是在启用了用户命名空间的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 && apt-get install -y mysql-server && rm -rf /var/lib/mysql && rm -rf /var/lib/apt/lists/*

  2. 在入口点脚本

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

    假设卷已安装在容器内的/mnt/dbice run -v <volume name>:/mnt/db --publish 3306...cf ic run --volume <volume name>:/mnt/db ...)。    定义mountpath env var

    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

    从群组mysql

    中删除root

    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

答案 1 :(得分:2)

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

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

- IBM Containers也不支持用户选项。

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

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