launch_container.sh 4.93 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
12
13
14
15
16
17
18
19
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# 4. bash launch.sh -v 启动容器并显示连接命令

# ==================== 配置区域 ====================
# 镜像配置
docker_image="dcu_ai:v1.1"
container_name="yolov5_test_dtk24.04.1"

# 挂载卷配置 (格式: "宿主机路径:容器路径")
# 可以添加多个挂载,用空格分隔
mounts=(
    "/opt/hyhal:/opt/hyhal"
    "/home/wkx/yolov5/datasets:/datasets"
)

# 环境变量配置
environment_vars=(
    "https_proxy=http://10.17.26.123:8086"
    "http_proxy=http://10.17.26.123:8086"
)

# 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}"
    
    # 添加额外参数
    for arg in "${extra_args[@]}"; do
        cmd="${cmd} ${arg}"
    done
    
    # 添加环境变量
    for env in "${environment_vars[@]}"; do
        cmd="${cmd} -e ${env}"
    done
    
    # 添加设备
    for device in "${devices[@]}"; do
        cmd="${cmd} --device=${device}"
    done
    
    # 添加挂载卷
    for mount in "${mounts[@]}"; do
        cmd="${cmd} -v ${mount}"
    done
    
    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
88
89
90
91
92
93
94
95
96

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

check_command_result() {
    local exit_status=$1
    
    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
149
150
151
152
153
154
155
156
157
158
159
160
    fi
    
    # 如果是 -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
163
164
165
166
167
168
    fi
    
    # 默认行为:进入容器
    docker start ${CONTAINER_NAME}        
    docker exec -ti --env COLUMNS=`tput cols` --env LINES=`tput lines` ${CONTAINER_NAME} /bin/bash
    exit
    
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
182
183
184
185
186
187
188
    
    # 如果是 -v 模式,显示信息后退出
    if [ "$show_connect_cmd" = true ]; then
        show_container_info
        exit
    fi
    
    docker exec -ti --env COLUMNS=`tput cols` --env LINES=`tput lines` ${CONTAINER_NAME} /bin/bash
wangkx1's avatar
wangkx1 committed
189
190
    exit
fi