launch_container.sh 5.02 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
docker_image="harbor.sourcefind.cn:5443/dcu/admin/base/vllm:0.11.0-ubuntu22.04-dtk25.04.2-1226-das1.7-py3.10-20251226"
wangkx1's avatar
wangkx1 committed
13
14
15
container_name="wkx-dtk25042-vllm-0.11.0-1226-v2"
# 工作目录配置(容器内的开发目录)
work_dir="/datav/wkx"
wangkx1's avatar
wangkx1 committed
16
17
18
19
20

# 挂载卷配置 (格式: "宿主机路径:容器路径")
# 可以添加多个挂载,用空格分隔
mounts=(
    "/opt/hyhal:/opt/hyhal"
wangkx1's avatar
wangkx1 committed
21
    "/datav:/datav"
wangkx1's avatar
wangkx1 committed
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
51
52
)

# 环境变量配置
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
53

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

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

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

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

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

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

# 检查 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
88

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

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

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

wangkx1's avatar
wangkx1 committed
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# 检查是否有 -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
130
131
132
133
134
135
136
137
138
139
140
# 检查容器是否存在
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
141
            exit
wangkx1's avatar
wangkx1 committed
142
143
144
145
146
147
        fi

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

wangkx1's avatar
wangkx1 committed
150
151
152
153
154
155
156
157
158
159
160
    # 如果是 -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
161
        exit
wangkx1's avatar
wangkx1 committed
162
    fi
wangkx1's avatar
wangkx1 committed
163

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

wangkx1's avatar
wangkx1 committed
169
170
171
172
173
174
175
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
176
    docker start ${CONTAINER_NAME}
wangkx1's avatar
wangkx1 committed
177
    exit_status=$?
wangkx1's avatar
wangkx1 committed
178
    check_command_result $exit_status
wangkx1's avatar
wangkx1 committed
179
180

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

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

wangkx1's avatar
wangkx1 committed
188
    docker exec -ti --env COLUMNS=`tput cols` --env LINES=`tput lines` ${CONTAINER_NAME} /bin/bash -c "cd ${work_dir} && exec /bin/bash"
wangkx1's avatar
wangkx1 committed
189
190
    exit
fi