容器特性支持

57 阅读2分钟

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作业的拉起

image.png

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: ''