使用singularity本地部署wandb

1. 背景:

wandb self-host(本地部署)官网只支持docker,而不支持singularity,但是现在部分高校或者企业在集群上完全使用singularity替代docker (原因:docker可以挂载任意目录,而容器内是root权限,导致容器外对文件设置的权限,在容器内完全是无用的,因为root用户可以访问修改任意文件,从而很容易hack宿主机)

2. 解决办法

本教程要求用户必须有singularity的fakeroot权限或者已经在sudo组!!!
如果所属企业或者高效连fakeroot权限都不给,那确实无解

废话不多说,直接上代码

2.1 根据singularity官网命令,将docker镜像转换为sig镜像

singularity build --sandbox  wandb_sig/  docker://wandb/local:latest

# 备选方案:如果提示无法访问hub.docker.io, 则需要间接处理
# 1. 找一台有docker的电脑
# 2. 拉去wandb/local镜像
docker pull wandb/local
# 3. 将镜像保存为tar包
docker save -o wandb_latest.tar wandb/local
# 4. 将tar包复制到安装singularity的机器上
# 5. build 镜像
singularity build --sandbox  wandb_sig/ docker-archive://wandb_latest.tar

2.2 接着创建挂载目录(用于将容器内产生的文件备份到宿主机)

# 假设挂载路径为/path/to/vol
mkdir /path/to/vol # 挂载路径
chmod 777 vol # 权限必须转换为777

# 如果已经存在挂载目录,并且该目录为启动docker容器时使用的目录,需要将目录权限修改为777

2.3 启动容器

# 启动容器, -f 为fakeroot权限, -w 为 修改镜像的权限, --net***为端口映射,容器名为wandb
singularity instance start -f -w  --net --network-args "portmap=port:8080/tcp" --env HOST=http://ip_or_domain_name:port --bind /path/to/vol:/vol wandb_sig wandb

2.4 修改相关目录的权限

# 进入容器
singularity shell --writable-tmpfs instance://wandb

# 挂载路径内的owner和grouper修改,owner要改成wandb,grouper要改为root
chmod -R wandb:root /vol/*

# 部分目录也需要修改,直接copy就行 (uid:999 就是wandb, gid:0 就是root)
chown -R wandb:0  /etc/logrotate.d /etc/my_init.d /etc/nginx /etc/service /etc/container* /var/app
chown -R root:mail /var/mail
chown -R root:staff /var/local
chown -R wandb:root /tmp/GORILLA_STARTED_UNIX_TIME /tmp/load_env_output

# 下面这两行是为了让root用户可以无密码登录,docker容器默认就可以实现这一点
echo "[mysqld]" >> /etc/mysql/my.cnf
echo "skip-grant-tables" >> /etc/mysql/my.cnf

# 修改完成后退出即可
exit

2.5 启动wandb服务 – 转换成singularity后不会自动启动容器内的服务(比如网页,mysql,minio存储等)

# 进入容器
singularity shell --writable-tmpfs instance://wandb
# 切换到wandb用户,启动服务
su wandb
/sbin/my_init

# 我目前还不知道singularity如何在不结束当前运行进程的情况下,退出terminal
# 我选取的方法是直接关掉终端,这样可以保证容器内的进程不被kill
# 启动新的终端,在宿主机内测试是否可以访问到网页:
curl http://localhost:port  # 或者 wget http://localhost:port
# 如果可以正常访问,则已经成功95%啦

2.6 最后一步,端口映射

singularity 暴露的端口只能在宿主机上访问,无法在外网访问,如果需要外网访问,需要使用ssh做一次代理 (在部署wandb的宿主机上执行)
ssh -CfNg -L external_port:127.0.0.1:port username@locahost -i ~/.ssh/id_rsa
external_port是外网访问时的端口, port为 singularity容器启动时映射的端口,这两个值不能一样,端口值大于1024即可, 比如 port 为 9998,external_port为 9999

该命令的作用时,当访问本机的external_port时,将数据转发到本机的port端口

目前该命令需要使用密钥登录账户,如果只能使用密码登录,需要百度一下。

外网访问 http://xxx:external_port 就可以成功访问啦。

如有任何问题,欢迎留言讨论!!!

你可能感兴趣的:(电脑常识,linux入门常识,linux,docker,singularity,wandb)