在容器中,我正在尝试启动mysqld。
我能够创建一个图像并推送到注册表,但是当我想启动它时,/var/lib/mysql
卷无法初始化,因为我尝试对其进行chown mysql
这是不允许的。
我查看了特定于码头的解决方案,但现在我无法做任何工作。
有没有办法在bluemix上为绑定挂载的文件夹设置正确的权限?或支持选项--volumes-from
,我似乎无法使其正常工作
我现在能看到的唯一解决方案是以root身份运行mysqld,但我不愿意。
cf ic volume create database
尝试在我的数据库容器上运行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:更改&#39; / var / lib / mysql的所有权&#39;:权限被拒绝。
我也使用sudo或脚本以不同的方式尝试了上述方法。我尝试使用mysql_install_db --user=root
,它确实正确设置了我的文件夹,除了它由root用户拥有,我宁愿让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
我使用选项--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
显示:
[{&#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
不受支持,以及第一次没有停留在第二次运行中创建的数据。
答案 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操作。
这是解决方法,你可能想尝试
在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.1在bind-mount下以用户mysql
创建mysql数据目录,然后将其链接为/var/lib/mysql
假设卷已安装在容器内的/mnt/db
(ice 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
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更改为正确的位置。