-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrun
executable file
·119 lines (109 loc) · 2.9 KB
/
run
1
2
3
4
5
6
7
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/usr/bin/env bash
set -e
SCRIPT_DIR="$(cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null 2>&1 && pwd)"
IMAGE=$(basename $SCRIPT_DIR)
GID=$(id -g $USER)
DOCKER_XAUTHORITY=/tmp/.docker.xauth
SHELL_NAME=$(basename $SHELL)
# https://wiki.ros.org/docker/Tutorials/Hardware%20Acceleration#nvidia-docker2
if [ ! -f $DOCKER_XAUTHORITY ]; then
xauth_list=$(xauth nlist $DISPLAY | sed -e 's/^..../ffff/')
if [ ! -z "$xauth_list" ]; then
echo $xauth_list | xauth -f $DOCKER_XAUTHORITY nmerge -
else
touch $DOCKER_XAUTHORITY
fi
fi
function loud_docker() {
set -x
nvidia-docker $@
set +x
}
function build_image() {
local tmp=$(mktemp)
if ! docker build \
--build-arg USER=$USER \
--build-arg UID=$UID \
--build-arg GID=$GID \
--build-arg SHELL=$SHELL_NAME \
-t $IMAGE $SCRIPT_DIR &> $tmp; then
result=$?
>&2 cat $tmp
exit $result
fi
}
build_image
IMAGE_ID=$(docker images $IMAGE --format "{{.ID}}")
function get_existing_container() {
docker ps -a --filter "ancestor=$IMAGE_ID" --format "{{ .ID }}" | head -n1 || echo ""
}
function exec_container() {
if [[ $# -ge 2 ]]; then
cmds=${@:2}
else
cmds=($SHELL_NAME)
fi
local container=$(get_existing_container)
nvidia-docker start $container 1> /dev/null
set -x
nvidia-docker exec -it $container $cmds
}
function usage() {
>&2 echo "Usage: $0 [start|stop|exec|rm|rmi]"
}
if [[ $# -eq 0 ]]; then
set start
fi
EXISTING_CONTAINER=$(get_existing_container)
case $1 in
"start")
if [ -z "$EXISTING_CONTAINER" ]; then
loud_docker run -t \
-u $UID:$GID \
--env="DISPLAY=$DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
--env="XAUTHORITY=$XAUTHORITY" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
--volume="$DOCKER_XAUTHORITY:$XAUTHORITY" \
--volume="$SCRIPT_DIR:/home/$USER/workspace" \
--runtime=nvidia \
--detach \
-h $SCRIPT_DIR \
$IMAGE \
cat -
exec_container $@
else
exec_container $@
fi
;;
"stop")
if [ ! -z "$EXISTING_CONTAINER" ]; then
docker stop "${@:2}" $EXISTING_CONTAINER
else
>&2 echo "Error: no such container"
exit 1
fi
;;
"exec")
if [ ! -z "$EXISTING_CONTAINER" ]; then
exec_container $@
else
>&2 echo "Error: no such container"
exit 1
fi
;;
"rm")
if [ ! -z "$EXISTING_CONTAINER" ]; then
docker rm "${@:2}" $EXISTING_CONTAINER
else
>&2 echo "Error: no such container"
exit 1
fi
;;
"rmi")
docker rmi $IMAGE
;;
*)
usage
exit 1
esac