# 构建 Docker 镜像

FlyDog SDR 在 Docker 中运行,所以需要构建 FlyDog SDR 的 Docker 镜像。

目前,用户可通过两种方式构建 Docker 镜像。

  • 通过 Docker Buildx 跨平台构建镜像
  • 通过树莓派上直接构建

下述内容将依次介绍这两种构建方式。

# 搭建开发环境

# 通过 Docker Buildx

Docker Buildx 是一个 Docker CLI 插件,扩展了 docker 命令,支持 Moby BuildKit 提供的功能,为用户提供了与 docker build 相同的体验,并增加了许多新功能。

Moby BuildKit 是下一代的镜像构建组件,利用其可以跨平台构建镜像的特性,本方法可以用于在 Linux、macOS 和 Windows 系统下构建 FlyDog SDR 的 Docker 镜像。

需要注意,该功能仅适用于 Docker v19.03+ 版本。

在已经安装了 Docker 的情况下,要使用 Docker Buildx,需要临时开启 Docker 实验特性。

Linux 或 macOS 下,使用 export 命令设置环境变量。

[fdsdr@flydog-sdr-project ~]$ export DOCKER_CLI_EXPERIMENTAL=enabled

对于 Windows 系统,在 Windows PowerShell 中使用 set 命令打开 Docker 实验特性。

PS C:\Users\FLYDOG> set $env:DOCKER_CLI_EXPERIMENTAL="enabled"

然后检验 Docker Buildx 是否成功启用。

[fdsdr@flydog-sdr-project ~]$ docker buildx version
github.com/docker/buildx v0.5.1-docker 11057da37336192bfc57d81e02359ba7ba848e4a

新建一个 Builder 实例,名为 arm_builder

[fdsdr@flydog-sdr-project ~]$ docker buildx create --name arm_builder --driver docker-container

指定使用新建的 Builder 实例。

[fdsdr@flydog-sdr-project ~]$ docker buildx use arm_builder

检查已有的 Builder 实例,arm_builder 应当包含于返回的结果中。

[fdsdr@flydog-sdr-project ~]$ docker buildx ls
NAME/NODE      DRIVER/ENDPOINT             STATUS   PLATFORMS
arm_builder *  docker-container
  arm_builder0 unix:///var/run/docker.sock inactive
default        docker
  default      default                     running  linux/amd64, linux/386

Docker 在 linux/amd64 系统架构下默认不支持构建 ARM 架构 Docker 镜像,因此需导入 binfmt_misc

Windows 下安装的 Docker 无需进行此项设置。

[fdsdr@flydog-sdr-project ~]$ docker run --rm --privileged tonistiigi/binfmt --install all

# 通过树莓派

对处理器架构进行检查,确保架构为 armv7l

[fdsdr@flydog-sdr-project: ~]$ uname -m
armv7l

使用 Docker 相关安装脚本实现自动化部署开发环境。

[fdsdr@flydog-sdr-project ~]$ sudo curl -o /tmp/get-docker.sh -fsSL get.docker.com
[fdsdr@flydog-sdr-project ~]$ sudo chmod +x /tmp/get-docker.sh
[fdsdr@flydog-sdr-project ~]$ sudo sh -c /tmp/get-docker.sh

对于中国大陆开发者,在安装 Docker 时,可以加上 --mirror AzureChinaCloud 参数,使用 AzureChinaCloud 镜像进行安装。

[fdsdr@flydog-sdr-project ~]$ sudo sh -c /tmp/get-docker.sh --mirror AzureChinaCloud

安装完成后,将当前用户添加至 Docker 用户组 docker,然后重启。

[fdsdr@flydog-sdr-project ~]$ sudo usermod -aG docker ${USER}
[fdsdr@flydog-sdr-project ~]$ sudo systemctl enable docker
[fdsdr@flydog-sdr-project ~]$ sudo reboot

# 拉取 Dockerfile

确保开发机器已经安装 Git,并从 GitHub 拉取构建 FlyDog SDR 所需的 Dockerfiles。

[fdsdr@flydog-sdr-project ~]$ git clone https://github.com/flydog-sdr/docker-builder

对于中国大陆开发者,可能需要将 github.com 替换为其镜像地址 github.com.cnpmjs.org,以加速拉取速度。

进入 docker-builder/flydog-sdr 目录,对 Dockerfile 中相关环境变量酌情修改。

[fdsdr@flydog-sdr-project ~]$ cd docker-builder/flydog-sdr
[fdsdr@flydog-sdr-project flydog-sdr]$ vim Dockerfile

相关变量说明如下。

变量 说明
APT_MIRROR Debian 镜像源
GIT_BRANCH 指定 Git 分支
GIT_HOST 指定 GitHub 域名,针对中国大陆加快构建速度
GIT_USER 指定要拉取之专案所对应的用户名
REPO_NANE 指定专案名称

# 执行构建

# 通过 Docker Buildx

使用 docker buildx 命令启动构建进程。

[fdsdr@flydog-sdr-project flydog-sdr]$ docker buildx build --platform linux/arm/v7 -t flydog-sdr -o type=docker -f ./Dockerfile .

大约 20 分钟后,即可完成构建,Docker 镜像列表中亦可看到刚刚生成的镜像。

[fdsdr@flydog-sdr-project flydog-sdr]$ docker images
REPOSITORY                                                TAG        IMAGE ID       CREATED        SIZE

flydog-sdr                                                latest     7865b2e324eb   22 hours ago   252MB

# 通过树莓派

使用 docker build 命令启动构建进程。

[fdsdr@flydog-sdr-project flydog-sdr]$ docker build -t flydog-sdr .

大约 20 分钟后,即可完成构建,Docker 镜像列表中亦可看到刚刚生成的镜像。

[fdsdr@flydog-sdr-project flydog-sdr]$ docker images
REPOSITORY                                                TAG        IMAGE ID       CREATED        SIZE

flydog-sdr                                                latest     7865b2e324eb   22 hours ago   252MB