Docker (Ubuntu) 开发环境

https://docs.docker.com/engine/install/ubuntu

目前有多种 Docker 开发环境,可根据需求进行选择:

  • Docker 与编译环境

  • VsCode 的 Developing inside a Container

Docker 与编译环境

Docker 镜像的特点对嵌入式开发环境而言,堪称完美:

  • 不可变:编译环境统一,稳定

  • 可分发:内部迁移方便,对外提供环境也方便

  • 档案化: Docker 镜像基于 Dockerfile, 依赖关系清晰,还可做版本控制

docker_env.bash

 1#!/bin/bash
 2
 3IMAGE="${1:-ubuntu}"
 4
 5docker run  -it                                     \
 6            --rm                                    \
 7            -v "/etc/group:/etc/group:ro"           \
 8            -v "/etc/passwd:/etc/passwd:ro"         \
 9            -v "/etc/shadow:/etc/shadow:ro"         \
10            --user "$(id -u):$(id -g)"              \
11            --workdir="/home/$(id -un)"             \
12            -v "/home/$(id -un):/home/$(id -un)"    \
13            "${IMAGE}" bash

脚本解析:

  • 3 行,如果未指定镜像,则选择 ubuntu 镜像

  • -it 开启交互,并提供终端

  • --rm 退出即删除

  • 7 ~ 9 行,以只读方式挂在用户信息

  • 10 行,以当前用户登录

  • 11 行,在容器内制定工作目录

  • 12 行,挂载当前用户主目录至容器工作目录

  • 12 行,指定镜像,并启动 bash

为什么要这么做,当用户主目录挂在到容器工作目录后,容器和主机对用户主目录均有读写权限,但此时容器默认以 root 用户运行,这导致编译过程产生的文件属于 root, 主机读取时需要修改权限,切换其它任意用户都存在这样的问题。该方案直接映射用户和目录,并以当前用户登录。

Visual Studio Code Dev Containers

这是上一个方案的加强版, 将工作目录映射到容器内, VScode 再远程到容器内。整个过程由 Visual Studio Code Dev Containers 插件实现,参数和配置由工作目录下的 .devcontainer/devcontainer.json 文件决定。

本节技术细节参考: https://code.visualstudio.com/docs/devcontainers/containers