1 容器特性支持
1.1 遇到的问题
1.1.1 Docker默认需要root身份,普通用户无法启动docker,用户执行容器作业必须用用户的身份去拉起容器
解决: agent进程是以ccs_agent身份运行的,将ccs_agent用户加入到docker用户组,然后用运行docker命令的时候加上option: -u {uid}
容器本身以Agent用户(Docker)或执行用户(Singularity)身份启动,容器内的任务以执行用户身份启动。
Singulariy默认就是使用执行用户身份启动
1.1.2 容器使用的资源限制
使用cgroup保证容器的资源限制,不使用额外的option来做限制
1.1.3 容器镜像清理
脚本通过docker images命令获取到节点上的所有容器镜像名,并通过docker event命令依次查询指定时间内镜像是否被使用。如果无法查询到镜像的使用记录,该镜像文件将被删除
#History: 2023-08-16 modified
# Setting Time Variables
# Check whether the current user is the root user.
if [ "$(id -u)" -eq 0 ]; then
echo "Error: Root user is not allowed to execute this script."
exit 1
fi
TIME_WINDOW=$1
if [ -z "$TIME_WINDOW" ]; then
TIME_WINDOW=168h # Query time window. The default value is 7 days.
echo "the time variable not passed, default to cleaning images unused for over 7 days."
fi
echo " Clean up images that have not been used for more than $TIME_WINDOW ..."
IMAGE_LIST=$(docker images --format "{{.Repository}}:{{.Tag}}") # get all the image names
# Traverse the image list.
for IMAGE in $IMAGE_LIST; do
# Querying Image Usage Records
IMAGE_NAME_AND_TAG=$IMAGE
IMAGE_NAME=$(echo $IMAGE | cut -d: -f1)
USAGE_BY_ONLY_NAME=$(docker events --since $TIME_WINDOW --until "0m" --filter image=$IMAGE_NAME)
USAGE=$(docker events --since $TIME_WINDOW --until "0m" --filter image=$IMAGE_NAME_AND_TAG)
if [ -z "$USAGE" ] && [ -z "$USAGE_BY_ONLY_NAME" ]; then
# If there is no usage record, delete the image.
echo "Deleting unused image: $IMAGE"
docker rmi $IMAGE
fi
done
1.1.4 将宿主机的环境变量带到容器中
--env-file <(env) 参数用于将宿主机上的当前环境变量加入传递给容器
1.1.5 如何实现容器的控制操作,比如挂起,恢复等动作
使用option:cgroup-parent
因为我们配置模板有个cgroup-parent, 用作将调度器自己创建的cgroup作为docker自身cgroup的父cgoup,
1.1.6 容器的巨坑
如果容器作业的主脚本退出时, 转后台的命令还未运行完就会被容器给干掉。 因此需要用户做一件事情: 就是容器环境运行的执行脚本需要用户自己处理转后台的命令, 保证转后台的命令执行完时,主脚本这时候才可以退出
1.1.7 宿主机和容器环境共享网络环境
--net host
1.1.8 容器内部实现mpirun作业的拉起
1.1.9 镜像不能跨架构, arm上可以run起来的镜像, 在x86上跑不起来
1.1.10 容器运行模板命令
appContainerRuntimes:
- type: 'docker'
run: "docker run \
--name %CONTAINER_OPTS_NAME \
--user '%CONTAINER_OPTS_UID:%CONTAINER_OPTS_GID' \
%CONTAINER_OPTS_USER_GROUPS \
--volume='/etc/group:/etc/group:ro' \
--volume='/etc/passwd:/etc/passwd:ro' \
--volume='/etc/shadow:/etc/shadow:ro' \
--volume='/tmp:/tmp' \
%CONTAINER_OPTS_VOLUMES \
--workdir %CONTAINER_OPTS_WORKDIR \
--cgroup-parent %CONTAINER_OPTS_CGROUP_PARENT \
--env-file %CONTAINER_OPTS_ENV_FILE \
--rm \
--net host \
--cap-drop 'ALL' \
%CONTAINER_OPTS_OTHERS \
%CONTAINER_OPTS_IMG \
%CONTAINER_OPTS_SHELL \
%CONTAINER_OPTS_CMD"
attach: 'docker exec -it %CONTAINER_OPTS_NAME %CONTAINER_OPTS_CMD'
- type: 'singularity'
run: "singularity exec %CONTAINER_OPTS_VOLUMES \
--env-file %CONTAINER_OPTS_ENV_FILE \
--drop-caps 'ALL' \
%CONTAINER_OPTS_OTHERS \
%CONTAINER_OPTS_IMG \
%CONTAINER_OPTS_SHELL \
%CONTAINER_OPTS_CMD"
attach: ''