forked from zju-rolab/thomas_docker
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstart.sh
executable file
·103 lines (91 loc) · 3.03 KB
/
start.sh
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
#!/usr/bin/env bash
CONTAINER_NAME=thomas_os
IMAGE_NAME=thomas:ros-kinetic-thomas-dev
BASE_DIR="$( cd "$(dirname "$0")" ; pwd -P )"
# User imformation
GRP=$(id -g -n)
USER_CONF="-e DOCKER_USER=$USER -e DOCKER_GRP=$GRP"
# Append group name & id for pointgrey if possible
PG_GRP='flirimaging'
if [ -n $(grep ${PG_GRP} /etc/group) ]; then
USER_CONF="${USER_CONF} -e PG_GRP=${PG_GRP}"
fi
if [ "$USER" = "root" ]; then
DOCKER_HOME="/root"
else
DOCKER_HOME="/home/$USER"
fi
# Use ~/.thomas to save persistent files
if [ ! -d $HOME/.thomas ]; then
mkdir -p $HOME/.thomas
fi
# Some mounts
MOUNTS="\
-v /media:/media \
-v /dev:/dev \
-v $HOME/.thomas:${DOCKER_HOME}/.thomas \
-v ${BASE_DIR}/scripts:/thomas/scripts \
"
# Gazebo directory
if [ -d $HOME/.gazebo ]; then
MOUNTS="${MOUNTS} -v $HOME/.gazebo:${DOCKER_HOME}/.gazebo"
fi
# If USB containing a valid workspace (1. file `THOMAS_WORKSPACE` exists, 2. directory `src` exists), set it as workspace
if [ -d $HOME/catkin_ws ]; then
MOUNTS="${MOUNTS} -v $HOME/catkin_ws:${DOCKER_HOME}/catkin_ws"
for disk in `ls /media/$USER`; do
if [ -f "/media/$USER/${disk}/THOMAS_WORKSPACE" ] && [ -d "/media/$USER/${disk}/src" ]; then
MOUNTS="${MOUNTS} -v /media/$USER/${disk}/src:${DOCKER_HOME}/catkin_ws/src"
fi
done
fi
# Use nvidia-docker if exists
if [ -n "`command -v nvidia-docker`" ]; then
DOCKER_CMD=nvidia-docker
IMAGE_NAME="${IMAGE_NAME}-nv"
else
DOCKER_CMD=docker
fi
# Display configuration
DISPLAY_CONF="-e QT_X11_NO_MITSHM=1 -v /tmp/.X11-unix:/tmp/.X11-unix:rw"
# Network configuration
HOST_HOSTNAME=`hostname`
LOCAL_HOSTNAME=docker-on-${HOST_HOSTNAME}
NET_CONF="\
--hostname ${LOCAL_HOSTNAME} \
--add-host ${LOCAL_HOSTNAME}:127.0.0.1 \
--add-host ${HOST_HOSTNAME}:127.0.0.1 \
"
# Set ROS_IP & ROS_MASTER_URI from environment variables
if [ -n "$ROS_IP" ]; then
echo "Using ROS_IP=${ROS_IP}"
NET_CONF="${NET_CONF} -e ROS_IP=${ROS_IP}"
fi
if [ -n "$ROS_MASTER_URI" ]; then
echo "Using ROS_MASTER_URI=${ROS_MASTER_URI}"
NET_CONF="${ROS_MASTER_URI} -e ROS_MASTER_URI=${ROS_MASTER_URI}"
fi
# Some system specific configuration
if [ $(uname) = 'Linux' ]; then
MOUNTS="${MOUNTS} -v /etc/localtime:/etc/localtime:ro"
DISPLAY_CONF="${DISPLAY_CONF} -e DISPLAY=:0"
NET_CONF="${NET_CONF} --net host"
elif [ $(uname) = 'Darwin' ]; then
DISPLAY_CONF="${DISPLAY_CONF} -e DISPLAY=host.docker.internal:0 -e LIBGL_ALWAYS_SOFTWARE=1"
NET_CONF="${NET_CONF} -p 11311:11311"
fi
if [ -n "$(docker container ls -a -f "name=${CONTAINER_NAME}" -f "status=exited" --format {{.ID}})" ]; then
# Continue the exited container if exists
docker start ${CONTAINER_NAME} > /dev/null
else
# Do the real run
${DOCKER_CMD} run -it -d --privileged \
--name ${CONTAINER_NAME} \
${DISPLAY_CONF} \
${NET_CONF} \
${USER_CONF} \
${MOUNTS} \
-w ${DOCKER_HOME} \
${IMAGE_NAME} \
/bin/zsh -c 'source /opt/ros/${ROS_DISTRO}/setup.zsh && roscore' > /dev/null
fi