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

如何在bluemix卷上使用docker修复权限?,docker,ibm-cloud,Docker,Ibm Cloud,在一个容器中,我试图启动mysqld 我可以创建一个映像并推送到注册表,但当我想启动它时,/var/lib/mysql卷无法初始化,因为我试图对它执行chown mysql,这是不允许的 我检查了docker特定的解决方案,但目前我无法进行任何工作 有没有办法在bluemix的绑定挂载文件夹上设置正确的权限?或者是否支持选项--中的卷,我似乎无法让它工作 我现在看到的唯一解决方案是以root身份运行mysqld,但我不希望这样 试试芒特·比德 使用cf ic volume create data

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

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

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

有没有办法在bluemix的绑定挂载文件夹上设置正确的权限?或者是否支持
选项--
中的卷,我似乎无法让它工作

我现在看到的唯一解决方案是以root身份运行mysqld,但我不希望这样

试试芒特·比德
  • 使用
    cf ic volume create database在bluemix上创建了一个卷
  • 尝试在我的数据库容器上运行
    mysql\u install\u db
    ,初始化它的内容

    docker run --name init_vol -v database:/var/lib/mysql registry.ng.bluemix.net/<namespace>/<image>:<tag> mysql_install_db --user=mysql
    
  • 我使用选项
    --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 run--name db\u srv--volumes from=db\u data registry.ng.bluemix.net//:sh-c'mysqld\u safe&tail-f/var/log/mysql.err'
    
  • docker inspect db_srv
    显示:

    [{“BluemixApp”:null,“Config”:{ ..., “工作目录”:“, …}…}]

    cf ic logs db_srv
    显示:

    150731 15:25:11 mysqld_安全启动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./mysql-bin.index(错误代码:13) 150731 15:25:11[错误]正在中止


    这是因为
    --不支持来自
    的卷,并且在第一次运行中创建的数据没有保留在第二次运行中。

    这里有多个问题。我将设法解决一些问题。也许这会让你朝着正确的方向前进一步

    --IBM容器中尚不支持来自的卷。您可以在第一个和后续容器上使用相同的--volume(-v)选项,而不是在第一个容器创建命令上使用-v,在后续容器上使用--volume

    --IBM容器也不支持用户选项

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


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

    在IBM容器中,用户名称空间为docker engine启用。“权限被拒绝”问题似乎是因为NFS不允许容器中的映射用户执行该操作

    在我的本地设置中,在docker主机上安装了一个NFS(导出时不带\u root\u squash选项)。并使用-v选项将卷附加到容器。当容器 从docker派生,禁用了用户名称空间,我可以在容器内更改绑定装载的所有权。但是有了启用了用户名称空间的docker,我得到了
    chown:更改“/mnt/volmnt”的所有权:不允许操作

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

    这是解决办法,你可以试试

  • 在Dockerfile中

    1.1在安装mysql之前,使用UID 1010或任何免费ID创建用户
    mysql
    。 其他容器或新容器可以访问UID1010卷上的mysql数据文件

    运行groupadd--gid 1010 mysql

    docker run --name db_data -v /var/lib/mysql registry.ng.bluemix.net/<namespace>/<image>:<tag> mysql_install_db --user=mysql
    
    运行useradd--uid 1010--gid 1010-m--shell/bin/bash-mysql

    docker run --name db_data -v /var/lib/mysql registry.ng.bluemix.net/<namespace>/<image>:<tag> mysql_install_db --user=mysql
    
    1.2安装MySqlL,但不初始化数据库

    运行apt-get-update&&apt-get-install-y mysql服务器&&rm-rf/var/lib/mysql&&rm-rf/var/lib/apt/lists/*

  • 在入口点脚本中

    2.1在bind mount下以user
    mysql
    的身份创建mysql数据目录,然后将其链接为
    /var/lib/mysql

    docker run --name db_data -v /var/lib/mysql registry.ng.bluemix.net/<namespace>/<image>:<tag> mysql_install_db --user=mysql
    
    假设卷安装在容器内的
    /mnt/db
    ice run-v:/mnt/db--publish 3306…
    cf ic run--volume:/mnt/db…
    )。 定义mountpath环境变量

    MOUNTPATH=“/mnt/db”

    将mysql添加到组“root”

    adduser mysql root

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

    chmod 775$MOUNTPATH

    在卷下创建mysql目录

    su-c“mkdir-p/mnt/db/mysql”mysql

    docker run --name db_data -v /var/lib/mysql registry.ng.bluemix.net/<namespace>/<image>:<tag> mysql_install_db --user=mysql
    
    su-c“chmod 700/mnt/db/mysql”mysql

    docker run --name db_data -v /var/lib/mysql registry.ng.bluemix.net/<namespace>/<image>:<tag> mysql_install_db --user=mysql
    
    将目录链接到/var/lib/mysql

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

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

    docker run --name db_data -v /var/lib/mysql registry.ng.bluemix.net/<namespace>/<image>:<tag> mysql_install_db --user=mysql
    
    从组中删除mysql
    root

    deluser mysql根目录

    chmod 755$MOUNTPATH

    2.2首次将数据库初始化为user
    mysql

    docker run --name db_data -v /var/lib/mysql registry.ng.bluemix.net/<namespace>/<image>:<tag> mysql_install_db --user=mysql
    
    su-c“mysql\u install\u db--datadir=/var/lib/mysql”mysql

    docker run --name db_data -v /var/lib/mysql registry.ng.bluemix.net/<namespace>/<image>:<tag> mysql_install_db --user=mysql
    
    2.3以用户身份启动mysql服务器
    mysql

    docker run --name db_data -v /var/lib/mysql registry.ng.bluemix.net/<namespace>/<image>:<tag> mysql_install_db --user=mysql
    
    su-c”/usr/bin/mysqld\u-safe“mysql

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

    那么您是说-v/var/lib/mysql将在我的所有容器之间持久化?还是在两次跑步之间?