我怎样才能修复使用docker在bluemix卷上的权限?

在一个容器中,我试图启动mysqld。

我能够创build一个映像,并推送到registry,但是当我想要启动它时, /var/lib/mysql卷不能初始化,因为我试图做一个chown mysql ,它是不允许的。

我检查了docker特定的解决scheme,但现在我无法做任何工作。

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

我现在可以看到的唯一的解决办法是以root身份运行mysqld,但我宁愿不要。

尝试与安装绑定

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

    docker run –name init_vol -v database:/ var / lib / mysql registry.ng.bluemix.net//:mysql_install_db –user = mysql

mysql_install_db应该填充/ var / lib / mysql并将权限设置为–user选项中设置的所有者

我得到chown: changing ownership of '/var/lib/mysql': Permission denied

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

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

  1. 我创build了一个容量为'/ var / lib / mysql'的数据容器

    docker run –name db_data -v / var / lib / mysql registry.ng.bluemix.net//:mysql_install_db –user = mysql

  2. 我使用选项–volumes-from运行我的db容器

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

docker inspect db_srv显示:

[{“BluemixApp”:null,“Config”:{…,“WorkingDir”:“”,…} …}]

cf ic logs db_srv显示:

150731 15:25:11 mysqld_safe从/ var / lib / mysql数据库启动mysqld守护进程150731 15:25:11 [/ usr / sbin / mysqld(mysqld 5.5.44-0ubuntu0.14.04.1-log)进程377 .. / usr / sbin / mysqld:未find文件'./mysql-bin.index'(Errcode:13)150731 15:25:11 [错误]正在中止

这是由于卷不是来自支持的,而是由于第一次创build的数据不是在第二次运行中。

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

在我的本地设置上,在docker主机上,挂载了一个NFS(使用no_root_squash选项导出)。 并使用-v选项将卷附加到容器。 当容器从停用者用被禁用的用户命名空间产生时,我能够改变容器内的绑定挂载的所有权。 但是在启用chown: changing ownership of '/mnt/volmnt': Operation not permitted用户名字空间的情况下,我得到了chown: changing ownership of '/mnt/volmnt': Operation not permitted

由cf创build的卷( cf ic volume create ... )是一个NFS,要validation刚才尝试从容器中mount -t nfs4 。 何时,为docker引擎启用用户命名空间。 容器中的有效root是容器进程外的non-root用户,NFS不允许映射的非root用户在容器内的卷上执行chown操作。

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

  1. 在Dockerfile中

    1.1在MySql安装之前,用UID 1010或任何免费的ID创build用户mysql 。 其他Container或新Container可以使用UID 1010访问卷上的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用户身份创buildmysql数据目录,然后将其作为/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组成员可以创build目录和文件

    chmod 775 $MOUNTPATH

    在卷下创buildmysql目录

    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 Containers中尚不支持–volumes-from。 您可以通过在第一个和后续容器上使用相同的–volume(-v)选项来取代该方法,而不是在第一个容器创build命令中使用-v,而在后续容器中使用-volumes-from。

IBM Containers也不支持–user选项。

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

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