美文网首页生信log
生信log30|从0构建非ROOT用户也可以修改的Singula

生信log30|从0构建非ROOT用户也可以修改的Singula

作者: 小周的万用胶囊 | 来源:发表于2022-12-25 10:31 被阅读0次

从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:走过路过,求观众老爷们点个赞


参考

mariadb镜像内的设置
非root用户安装使用Mysql

相关文章

  • 生信log30|从0构建非ROOT用户也可以修改的Singula

    从0构建非ROOT用户也可以修改的Singularity镜像-以安装Mysql-server为例-超算平台 吐槽:...

  • 利用ansible批量改 非root密码

    前提:要修改的密码非root修改用的用户非root 主脚本: anisble语句: 前提:1. 要修改的用户$us...

  • Debian 9 64bit下编译Openwrt

    固件需要在非root环境下进行 一,源码构建 安装所需环境: 在非root下,用户的home目录取LEDE源码: ...

  • 常用linux后门

    一。添加root权限用户一句话非交互式添加root权限用户useradd -o -u 0 -g 0 test &&...

  • day4

    1.用户、群组和权限 root 用户名—(x)密码—用户id(uid=0 =root用户)— 组id —用户描述信...

  • Ubuntu常用命令

    0 获取管理员权限切换至root用户下。命令su root输入密码就行 修改/etc/sudoers: 到root...

  • linux操作系统

    如何设置linux 系统 root 用户密码: sudo passwd; 输入密码就可以修改root用户密码成功

  • docker user问题

    有时候基础镜像的用户不是root,导致在容器内某些命令没有执行权限,所以在构建容器时需要给镜像修改用户为root。...

  • 小点--/etc/sudoers

    /etc/sudoer主要用来让非root用户执行一些命令时可以不需要输入root密码,也可以禁止该用户使用某些命...

  • 用户管理

    2018.11 .19 root: x :0:0:root:/root:/bin/bash 用户名:密码:用户ID...

网友评论

    本文标题:生信log30|从0构建非ROOT用户也可以修改的Singula

    本文链接:https://www.haomeiwen.com/subject/dhnvqdtx.html