launch_container.sh 4.88 KB
Newer Older
wangkx1's avatar
wangkx1 committed
1
#!/bin/bash
wangkx1's avatar
wangkx1 committed
2
3

# set -x
wangkx1's avatar
wangkx1 committed
4
# 脚本作用:
wangkx1's avatar
wangkx1 committed
5
6
7
# 1. bash launch.sh 直接进入容器
# 2. bash launch.sh d / bash launch.sh destroy 删除容器
# 3. bash launch.sh p / bash launch.sh print 打印容器名称
wangkx1's avatar
wangkx1 committed
8
9
10
11
# 4. bash launch.sh -v 启动容器并显示连接命令

# ==================== 配置区域 ====================
# 镜像配置
wangkx1's avatar
wangkx1 committed
12
13
docker_image="harbor.sourcefind.cn:5443/dcu/admin/base/vllm:0.11.0-ubuntu22.04-dtk25.04.2-1226-das1.7-py3.10-20251226"
container_name="wkx-dtk25042-vllm-0.11.0-1226"
wangkx1's avatar
wangkx1 committed
14
15
16
17
18

# 挂载卷配置 (格式: "宿主机路径:容器路径")
# 可以添加多个挂载,用空格分隔
mounts=(
    "/opt/hyhal:/opt/hyhal"
wangkx1's avatar
wangkx1 committed
19
    "/datav:/datav"
wangkx1's avatar
wangkx1 committed
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
)

# 环境变量配置
environment_vars=(
)

# Docker 设备配置
devices=(
    "/dev/kfd"
    "/dev/mkfd"
    "/dev/dri"
)

# Docker 运行参数
shm_size="32G"
extra_args=(
    "--ipc=host"
    "--group-add video"
    "--cap-add=SYS_PTRACE"
    "--security-opt seccomp=unconfined"
    "--network=host"
    "--privileged"
)

# ==================== 配置区域结束 ====================

export CONTAINER_NAME="${container_name}"

# 构建 docker run 命令
build_docker_command() {
    local cmd="docker run -id --name ${CONTAINER_NAME} --shm-size=${shm_size}"
wangkx1's avatar
wangkx1 committed
51

wangkx1's avatar
wangkx1 committed
52
53
54
55
    # 添加额外参数
    for arg in "${extra_args[@]}"; do
        cmd="${cmd} ${arg}"
    done
wangkx1's avatar
wangkx1 committed
56

wangkx1's avatar
wangkx1 committed
57
58
59
60
    # 添加环境变量
    for env in "${environment_vars[@]}"; do
        cmd="${cmd} -e ${env}"
    done
wangkx1's avatar
wangkx1 committed
61

wangkx1's avatar
wangkx1 committed
62
63
64
65
    # 添加设备
    for device in "${devices[@]}"; do
        cmd="${cmd} --device=${device}"
    done
wangkx1's avatar
wangkx1 committed
66

wangkx1's avatar
wangkx1 committed
67
68
69
70
    # 添加挂载卷
    for mount in "${mounts[@]}"; do
        cmd="${cmd} -v ${mount}"
    done
wangkx1's avatar
wangkx1 committed
71

wangkx1's avatar
wangkx1 committed
72
73
74
    cmd="${cmd} ${docker_image} /bin/bash"
    echo "${cmd}"
}
wangkx1's avatar
wangkx1 committed
75

wangkx1's avatar
wangkx1 committed
76
command=$(build_docker_command)
wangkx1's avatar
wangkx1 committed
77
78
79
80
81
82
83
84
85

# 检查 CONTAINER_NAME 环境变量是否设置
if [ -z "${CONTAINER_NAME}" ]; then
    echo "环境变量 CONTAINER_NAME 未设置,请设置后再试。"
    exit 1
fi

check_command_result() {
    local exit_status=$1
wangkx1's avatar
wangkx1 committed
86

wangkx1's avatar
wangkx1 committed
87
88
89
90
91
92
93
94
    if [ "$exit_status" -eq 0 ]; then
        echo "命令成功执行"
    else
        echo "命令执行失败,退出状态为: $exit_status"
        exit $exit_status
    fi
}

wangkx1's avatar
wangkx1 committed
95
96
97
98
99
100
101
102
103
104
# 显示容器连接信息
show_container_info() {
    echo ""
    echo "========================================="
    echo "容器名称: ${CONTAINER_NAME}"
    echo "连接命令:"
    echo "docker exec -it ${CONTAINER_NAME} /bin/bash"
    echo "========================================="
    echo ""
}
wangkx1's avatar
wangkx1 committed
105
106
107
108

# 使用 docker ps -a | grep 来查找容器,并计算结果行数
num=$(docker ps -a | grep "$CONTAINER_NAME" | wc -l)

wangkx1's avatar
wangkx1 committed
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# 检查是否有 -v 参数
show_connect_cmd=false
if [ "$#" -gt 0 ]; then
    for arg in "$@"; do
        if [ "$arg" = "-v" ]; then
            show_connect_cmd=true
            # 移除 -v 参数,避免干扰其他逻辑
            set -- "${@/$arg/}"
            # 重新构建参数列表,去除空参数
            args=()
            for a in "$@"; do
                [ -n "$a" ] && args+=("$a")
            done
            set -- "${args[@]}"
            break
        fi
    done
fi

wangkx1's avatar
wangkx1 committed
128
129
130
131
132
133
134
135
136
137
138
# 检查容器是否存在
if [ "$num" -gt 0 ]; then
    echo "Container:[${CONTAINER_NAME}] already exists"

    # 检查是否有参数传入
    if [ "$#" -gt 0 ]; then
        param="$1"
        if [ "$param" = "d" ] || [ "$param" = "destroy" ]; then
            docker stop ${CONTAINER_NAME}
            docker rm -f ${CONTAINER_NAME}
            echo "container:[${CONTAINER_NAME}] finish destroy."
wangkx1's avatar
wangkx1 committed
139
            exit
wangkx1's avatar
wangkx1 committed
140
141
142
143
144
145
        fi

        if [ "$param" = "p" ] || [ "$param" = "print" ]; then
            echo "container:[${CONTAINER_NAME}]."
            exit
        fi
wangkx1's avatar
wangkx1 committed
146
    fi
wangkx1's avatar
wangkx1 committed
147

wangkx1's avatar
wangkx1 committed
148
149
150
151
152
153
154
155
156
157
158
    # 如果是 -v 模式,显示信息后退出
    if [ "$show_connect_cmd" = true ]; then
        # 确保容器在运行状态
        container_status=$(docker inspect -f '{{.State.Status}}' ${CONTAINER_NAME} 2>/dev/null)
        if [ "$container_status" != "running" ]; then
            echo "Starting container..."
            docker start ${CONTAINER_NAME}
            check_command_result $?
            echo "Container:[${CONTAINER_NAME}] Started successfully!"
        fi
        show_container_info
wangkx1's avatar
wangkx1 committed
159
        exit
wangkx1's avatar
wangkx1 committed
160
    fi
wangkx1's avatar
wangkx1 committed
161

wangkx1's avatar
wangkx1 committed
162
    # 默认行为:进入容器
wangkx1's avatar
wangkx1 committed
163
    docker start ${CONTAINER_NAME}
wangkx1's avatar
wangkx1 committed
164
165
    docker exec -ti --env COLUMNS=`tput cols` --env LINES=`tput lines` ${CONTAINER_NAME} /bin/bash
    exit
wangkx1's avatar
wangkx1 committed
166

wangkx1's avatar
wangkx1 committed
167
168
169
170
171
172
173
else
    echo "Container:[${CONTAINER_NAME}] does not exist, will be created and go inside it."

    eval ${command}
    check_command_result $?
    echo "Container:[${CONTAINER_NAME}] Created successfully!"

wangkx1's avatar
wangkx1 committed
174
    docker start ${CONTAINER_NAME}
wangkx1's avatar
wangkx1 committed
175
    exit_status=$?
wangkx1's avatar
wangkx1 committed
176
    check_command_result $exit_status
wangkx1's avatar
wangkx1 committed
177
178

    echo "Container:[${CONTAINER_NAME}] Started successfully!"
wangkx1's avatar
wangkx1 committed
179

wangkx1's avatar
wangkx1 committed
180
181
182
183
184
    # 如果是 -v 模式,显示信息后退出
    if [ "$show_connect_cmd" = true ]; then
        show_container_info
        exit
    fi
wangkx1's avatar
wangkx1 committed
185

wangkx1's avatar
wangkx1 committed
186
    docker exec -ti --env COLUMNS=`tput cols` --env LINES=`tput lines` ${CONTAINER_NAME} /bin/bash
wangkx1's avatar
wangkx1 committed
187
188
    exit
fi