我怎样才能修复使用docker在bluemix卷上的权限?
在一个容器中,我试图启动mysqld。
我能够创build一个映像,并推送到registry,但是当我想要启动它时, /var/lib/mysql
卷不能初始化,因为我试图做一个chown mysql
,它是不允许的。
我检查了docker特定的解决scheme,但现在我无法做任何工作。
有没有办法从bluemix设置绑定挂载文件夹的权限? 或者是选项--volumes-from
支持,我似乎无法使其工作。
我现在可以看到的唯一的解决办法是以root身份运行mysqld,但我宁愿不要。
尝试与安装绑定
- 使用
cf ic volume create database
在bluemix上创build一个卷 -
尝试在我的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用户身份运行。
尝试使用来自数据容器的卷
-
我创build了一个容量为'/ var / lib / mysql'的数据容器
docker run –name db_data -v / var / lib / mysql registry.ng.bluemix.net//:mysql_install_db –user = mysql
-
我使用选项–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操作。
这里是解决方法,你可能想尝试
-
在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.1在bind-mount下以
mysql
用户身份创buildmysql数据目录,然后将其作为/var/lib/mysql
假设卷挂载在容器内的
/mnt/db
(ice run -v <volume name>:/mnt/db --publish 3306...
或cf ic run --volume <volume name>:/mnt/db ...
)。 定义mountpath env varMOUNTPATH="/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”将被视为系统尝试运行和失败的命令。
您共享的最后一条错误消息显示在工作目录中找不到某个文件,导致应用程序中止。 您可以通过使用脚本作为命令在容器中运行,将目录更改为正确的位置。