在项目的/apollo-master/docker/scripts目录下有cyberrt环境,dev环境、runtime环境的创建和进入脚本。其中*_start.sh
是创建容器的脚本,*_into.sh
是进入容器的脚本。
其中*_start.sh
的内容比较多,比较难理解,简单讲,这个脚本会先拉取一个基础的docker镜像。
拉取深度学习模型镜像,地图资源镜像,利用后拉取的辅助镜像创建docker volume。
能看到基础的镜像为apolloauto/apollo:dev-x86_64-18.04-20221124_1708
其余都是辅助镜像。
函数 docker_restart_volume()
用于重新创建一个指定名称和指定路径的 Docker Volume,并且指定使用哪个 Docker Image 来初始化 Volume 内容。该函数会首先拉取指定的 Docker Image,然后移除原有的 Volume 并重新创建一个新的 Volume,最后使用 Docker Image 中的内容来填充该 Volume。
函数中的这一句用docker run来创建Docker Volume,这种方式是我第一次见到,所以记录下
docker run -v "${volume}":"${path}" --rm "${image}" true
这里使用了 docker run 命令来创建一个新的容器,并通过 -v 参数来挂载一个 Docker Volume。具体来说,${volume}
表示要创建的 Volume 的名称,${path} 表示要挂载到容器中的目录路径,而image则表示用于初始化 Volume 内容的 Docker 镜像名称。
true 是容器内部执行的命令,因为 docker run 命令需要指定一个容器内部执行的命令,所以这里使用了一个不做任何事情的 true 命令来占位,从而让容器在启动后立即退出。这样就可以保证 Docker Volume 已经被填充了对应的内容并且保存到了本地磁盘上。同时,–rm 参数则表示容器退出后会自动删除,避免产生无用的容器占用系统资源。
在最终的创建容器时挂载第二步创建的docker volume。
${DOCKER_RUN_CMD} -itd \
--privileged \
--name "${DEV_CONTAINER}" \
-e DISPLAY="${display}" \
-e DOCKER_USER="${user}" \
-e USER="${user}" \
-e DOCKER_USER_ID="${uid}" \
-e DOCKER_GRP="${group}" \
-e DOCKER_GRP_ID="${gid}" \
-e DOCKER_IMG="${DEV_IMAGE}" \
-e USE_GPU_HOST="${USE_GPU_HOST}" \
-e NVIDIA_VISIBLE_DEVICES=all \
-e NVIDIA_DRIVER_CAPABILITIES=compute,video,graphics,utility \
#这里开始挂载volume
${MAP_VOLUMES_CONF} \
${OTHER_VOLUMES_CONF} \
${local_volumes} \
--net host \
-w /apollo \
--add-host "${DEV_INSIDE}:127.0.0.1" \
--add-host "${local_host}:127.0.0.1" \
--hostname "${DEV_INSIDE}" \
--shm-size "${SHM_SIZE}" \
--pid=host \
-v /dev/null:/dev/raw1394 \
"${DEV_IMAGE}" \
/bin/bash
最后我也自己操作了一下创建volume。