开头申明bash文件
#!/bin/bash
//设置只要有一条语句执行错误就会返回
set -e
//设置默认的参数项
# Default settings
CUDA="off"
IMAGE_NAME="autoware/autoware"
TAG_PREFIX="latest"
ROS_DISTRO="kinetic"
BASE_ONLY="false"
PRE_RELEASE="off"
AUTOWARE_HOST_DIR=""
USER_ID="$(id -u)"
//当地一个参数为-h是调用usage函数,也就相当于查看帮助文档
function usage() {
echo "Usage: $0 [OPTIONS]"
echo " -b,--base-only <AUTOWARE_HOST_DIR> If provided, run the base image only and mount the provided Autoware folder."
echo " Default: Use pre-compiled Autoware image"
echo " -c,--cuda <on|off> Enable Cuda support in the Docker."
echo " Default: $CUDA"
echo " -h,--help Display the usage and exit."
echo " -i,--image <name> Set docker images name."
echo " Default: $IMAGE_NAME"
echo " -p,--pre-release <on|off> Use pre-release image."
echo " Default: $PRE_RELEASE"
echo " -r,--ros-distro <name> Set ROS distribution name."
echo " Default: $ROS_DISTRO"
echo " -s,--skip-uid-fix Skip uid modification step required when host uid != 1000"
echo " -t,--tag-prefix <tag> Tag prefix use for the docker images."
echo " Default: $TAG_PREFIX"
}
# Convert a relative directory path to absolute
function abspath() {
local path=$1
if [ ! -d $path ]; then
exit 1
fi
pushd $path > /dev/null
echo $(pwd)
popd > /dev/null
}
//option选项要识别的短选项,后面带:表示可以带参数 \符号表示链接下面的命令 --long表示要识别的长选项, --name表示将错误报告给的程序,次错将错误报告给$0,即第文件本身,最后带的参数项目
OPTS=`getopt --options b:c:hi:p:r:st: \
--long base-only:,cuda:,help,image-name:,pre-release:,ros-distro:,skip-uid-fix,tag-prefix: \
--name "$0" -- "$@"`
eval set -- "$OPTS"
//下面的每个参数的作用在usage函数中已经说明,其中shift是向前移动指定个数的参数
while true; do
case $1 in
-b|--base-only)
BASE_ONLY="true"
AUTOWARE_HOST_DIR=$(abspath "$2")
shift 2
;;
-c|--cuda)
param=$(echo $2 | tr '[:upper:]' '[:lower:]')
case "${param}" in
"on"|"off") CUDA="${param}" ;;
*) echo "Invalid cuda option: $2"; exit 1 ;;
esac
shift 2
;;
-h|--help)
usage
exit 0
;;
-i|--image-name)
IMAGE_NAME="$2"
shift 2
;;
-p|--pre-release)
param=$(echo $2 | tr '[:upper:]' '[:lower:]') //将第二个参数中的大写改成小写然后输出到终端
case "${param}" in
"on"|"off") PRE_RELEASE="${param}" ;;
*) echo "Invalid pre-release option: $2"; exit 1 ;;
esac
shift 2
;;
-r|--ros-distro) //此处可以选择镜像的版本,调用build.sh 会直接去pull下载对应的镜像
ROS_DISTRO="$2"
shift 2
;;
-s|--skip-uid-fix)
USER_ID=1000
shift 1
;;
-t|--tag-prefix)
TAG_PREFIX="$2"
shift 2
;;
--)
if [ ! -z $2 ]; //判断第二个参数为非空是返回true
then
echo "Invalid parameter: $2"
exit 1
fi
break
;;
*)
echo "Invalid option"
exit 1
;;
esac
done
//输出各个选项的内容
echo "Using options:"
echo -e "\tROS distro: $ROS_DISTRO"
echo -e "\tImage name: $IMAGE_NAME"
echo -e "\tTag prefix: $TAG_PREFIX"
echo -e "\tCuda support: $CUDA"
if [ "$BASE_ONLY" == "true" ]; then
echo -e "\tAutoware Home: $AUTOWARE_HOST_DIR"
fi
echo -e "\tPre-release version: $PRE_RELEASE"
echo -e "\tUID: <$USER_ID>"
SUFFIX=""
RUNTIME=""
//
XSOCK=/tmp/.X11-unix
XAUTH=$HOME/.Xauthority
SHARED_DOCKER_DIR=/home/autoware/shared_dir
//与外部环境共享的autoware目录
SHARED_HOST_DIR=$HOME/shared_dir
AUTOWARE_DOCKER_DIR=/home/autoware/Autoware
//设置目录的权限
VOLUMES="--volume=$XSOCK:$XSOCK:rw
--volume=$XAUTH:$XAUTH:rw
--volume=$SHARED_HOST_DIR:$SHARED_DOCKER_DIR:rw"
if [ "$BASE_ONLY" == "true" ]; then
SUFFIX=$SUFFIX"-base"
VOLUMES="$VOLUMES --volume=$AUTOWARE_HOST_DIR:$AUTOWARE_DOCKER_DIR "
fi
if [ $CUDA == "on" ]; then
SUFFIX=$SUFFIX"-cuda"
RUNTIME="--runtime=nvidia"
fi
if [ $PRE_RELEASE == "on" ]; then
SUFFIX=$SUFFIX"-rc"
fi
//创建共享目录
# Create the shared directory in advance to ensure it is owned by the host user
mkdir -p $SHARED_HOST_DIR
IMAGE=$IMAGE_NAME:$TAG_PREFIX-$ROS_DISTRO$SUFFIX
echo "Launching $IMAGE"
//这里才真正运行带有自定义镜像的docker并配置相应的环境,并给使用者权限
docker run \
-it --rm \
$VOLUMES \
--env="XAUTHORITY=${XAUTH}" \
--env="DISPLAY=${DISPLAY}" \
--env="USER_ID=$USER_ID" \
--privileged \
--net=host \
$RUNTIME \
$IMAGE