生信log30|从0构建非ROOT用户也可以修改的Singula
从0构建非ROOT用户也可以修改的Singularity镜像-以安装Mysql-server为例-超算平台
吐槽:前段时间有需要集群上使用数据库的服务,因此下载了网上已有的Singulariy镜像,结果发现这个轮子使用前居然要求用root用户对镜像先进入镜像内进行交互设置。不得不说Root用户使用官网上已有的镜像是非常丝滑的,但是非root用户却被权限处处卡脖子,尤其是在宿主机和容器的通讯和容器设置这方面。这时候就得用户从头构建镜像文件了(搞基建),在这里以mariadb为例(mysql的免费版)。吐槽一句,Singularity说是非root友好,但实际上却是处处root,或者fakeroot(实际上还是需要宿主机上需要root用户权限)
0. 思路和目的
-
拉取一个系统基础镜像(这里使用centos7)
-
非root用户在linux怎么安装Mysql,在镜像中就怎么安装Mysql(其他软件也差不多)
-
不要去pull 现成的Mysql的Docker镜像,而是直接在镜像里面下载/或者拷贝MariaDB的包
-
在容器内创建一个非ROOT的用户归到mysql组内,创建(前提是宿主机上必须有该账户,否则在镜像内创建失败)
目的
- 使用镜像是为了给软件一个独立运行的环境并且以后迁移的时候不需要再开虚拟环境安装,拿来即用
- 使用Singularity而不是docker:超算平台除了管理员无人能root
- 为了非root用户能够进到镜像中对mysql进行设置(执行mysql_installation_db),且安装之后非root用户启动服务后,能使服务器写入日志文件
1. 准备-Singularity镜像文件(Definition File)的编写
- 首先需要一个有root权限的账号
- Singularity的Definition File对标的是Docker的Dockerfile
Bootstrap:shub #此处直接拉取系统的镜像
From:centos-base
%file #拷贝文件进入镜像
source_path dest_path
%post #这里是下载软件的地方,镜像内执行的命令写在此处
yum install less
yum install vim
yum install wget
yum install xz
yum install -y libsystemd.so.0 #这个不安装mysql会报错
yum clean all
groupadd mysql
useradd -m -g mysql mysql
useradd -m -g mysql not_root_user#创建非root用户,宿主机上也需要有
su not_root_user #换到非root用户
mkdir mysql
mkdir /mysql/db
wget mariadb_安装包下载地址
tar -xvf mariadb_version.tar.gz
rm -f mariadb_version.tar.gz
ln -s /mariadb/mariadb_version_解压缩后的文件夹 mysql
chmod -R 777 /mariadb/mysql #修改目录权限
chmod 644 /mariadb/.my.cnf #修改文件权限,mysql规定了这个文件不能设置人人可读写的,必须改成除了管理员以外只读的权限,这个配置文件写不写都可以,到时候映射进去就行。
cd /mariadb/mysql/
%startscript
exec "mysqld_safe" --defaults-=/your_path/.my.cnf
Singularity镜像的小细节:
-
容器开放端口的问题:
端口绑定需要fakeroot或者root的权限
Singularity确实提供了类似docker run里面的-p 3306:3306
类似的端口绑定功能。对应的代码为--net --network-args "portmap=8080:80/tcp"
,8080为宿主机端口,80为镜像内的端口,--net
和--network-args
必须输入,两者为绑定关系。 -
容器内路径:
想要知道自己运行容器时,容器内部的路径是哪,可以在%startscript
除加上echo $PWD
。
- exec实际运行的是什么
exec执行的是容器内的文件,若想使用参数应该写成exec "执行文件所在配置" 其他参数
的形式
mysqld
或者mysqld_safe
二进制执行文件本身,而不是单纯的软件应用指令,若是想在指令里面指定配置文件,需要写成,否则会报没有此文件的错
exec文件报错
2. 检查启动Mysql的服务状态
镜像实例启动命令
singularity instance start --writable-tmpfs -B db/:/var/lib/mysql mariadb.sif mariadb
启动后还需检查进程是否存在,可使用以下方法
-
一: 通过
ps -aux|grep mysql
检查后台是否存在守护进程,如下所示
not_root+ 19014 0.0 0.0 9708 1592 pts/2 S+ 17:37 0:00 /bin/sh ./bin/mysqld_safe --datadir=/mariadb/tmp
not_root+ 19088 0.5 0.2 1039484 90348 pts/2 Sl+ 17:37 0:00 /mariadb/mysql/bin/mariadbd --basedir=/mariadb/mysql --datadir=/mariadb/tmp --plugin-dir=/mariadb/mysql/lib/plugin --user=mysql --log-error=/mariadb/tmp/manager.err --pid-file=manager.pid
- 二:查看网络端口
netstat -anp|grep port
- 三:在容器外连接Mysql
mysql -h ip_address -u user -pPassword
容器外登录
3. 其他注意的点
Mysql的坑
-
preallocating 问题:mysql的tmp在镜像中的tmp目录不够大,外部进入是挂载就可以了
-
mysql plugin不存在:是因为mysql_installation_db这个程序并没有正确启动
-
mysqld_safe(mysql的看门狗程序)和mysqld的data目录必须都在 mysql_installation_db --datadir中 datadir所在的位置,因为插件和系统表格都在那里,且mysqld需要用这些插件和表
-
mysqld_safe的日志需要指定到容器位置:不指定写日志文件位置的,默认会在
/usr/local/mysql/data/
创建/usr/local/mysql/data/manager.err,而这个位置,非root用户一般没有文件权限 -
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111):除了后台可能已经有一个mysqld服务并且占用了同样的端口以外,其他原因还可能是因为mysqld服务没有启动。
ERROR 2002错误
ps:走过路过,求观众老爷们点个赞