创新探索,在物联网中进行持续部署

简介: 最近,接到了一个新兴的物联网项目,作为一名专职的网络开发,这次的项目让我感到惊讶的同时也有点担心。原因在于物联网的开发工具的并不完全适用于云控制台,所以我开始配置持续集成/部署,来提高我的工作效率。

screenshot

出品丨Docker公司(ID:docker-cn)
编译丨小东
每周一、三、五晚6点10分 与您不见不散!


现 状

我有一个代码库,它是用 rust 编写并链接了两个 C 依赖项。我有一个 Raspberry Pi 3B + (树莓派),我的代码将在这台机器上运行。最后一件事是我希望在我的开发过程中能够遵循最佳实践。我想将我的 dev 分支的 pull 请求合并到我的主分支,同时我希望我的新代码在发生这种情况时自动运行。看起来似乎很简单,对吧?


第一部分:树莓派上的环境

在我的大多数开发中,我所做的一切最终都将在一个 docker 容器中运行。所有系统依赖关系都明确写在 Dockerfile 中,我可以在版本控制中进行跟踪,一切都是沙盒。为了让我的应用程序在 docker 中运行,在树莓派上运行,我需要确保两件事 —— 主机操作系统和 docker 镜像。

A、主机

我在这里没有做太多的深入研究,所以不能保证我做出的决定是完美的。我找到了 hypriot,一个专为树莓派运行 docker 容器提供主机操作系统的项目,并决定使用它。到目前为止,它对我来说已经相当不错了。

B、镜像

最终目标是从基础镜像中进行提取,从我使用的任何构建环境中复制我的实际应用程序,然后进行部署。这里的主要任务是找到要构建的基础镜像。这应该是非常简单的,因为 rust 的一个卖点就是轻量级的运行时环境和便携性。然而,即使运行时相当轻量,但我的基础 rust 应用程序仍然需要一些东西的辅助才能运行。我对我的可执行二进制文件的启动过程做了一些研究和实验,并为我的最终镜像提出了以下的需求列表:

glibc —— 尽管有 musl 的存在,并且可以通过静态链接获得一些非常轻量级的 docker 镜像,但我需要在我的应用程序中使用 glibc 中的一些额外的 Linux 特定调用,例如,动态链接的 glibc 会列出要安装的东西。

ld.so —— 之前我没有意识到它的重要性,直到因为缺少它的存在导致应用程序出现问题。它是执行 execv 调用和 fn main() 启动之间的运行部分,它负责查找应用程序链接并设置它们的所有动态库。

libpcap ——这是我在我的应用程序中使用的 C 库。对 rust 的绑定目前只支持动态链接,因此需要将共享对象拖入我最终构建的镜像中。

cool-aginicx-application-1 —— 应用程序本身。从根 CA 证书到 jemalloc 的所有内容都包含在此处。

大多数都是一些简单的东西,glibc 和 ld.so 是大多数 Linux 发行版的基础组件,而我的应用程序只是一个构建工件。但问题是,它们都需要 arm 编译后才可以在树莓派上运行。所以,arm 编译会导致这一切变得相当复杂。

第一步是找到一个基础的 docker 图像,其中包含我需要的基本功能 —— glibc 和 ld.so。跨平台的 docker 镜像现在是一个有趣的空间,有两种不同的模式出现。

推荐的方式是使用 Docker 清单 —— 你可以为你想要支持的架构创建一个单独的镜像,然后创建一个大的“元镜像”,它只存储从 CPU 架构到实际 docker 镜像的映射。这很棒,因为每个人都可以从同一个 debian:stretch 镜像拉取他们需要的东西,并可以神奇的在他们自己的机器上使用。但不幸的是,当你想从 debian:stretch 镜像中拉取到不同机器并使用他们时,它就不那么好用了,因为这是在交叉编译。目前这种拉取只能通过 CLI / API 中的实验选项实现,还没有实现通过可复制的 Dockerfile 进行构建。

老方法是为每个架构创建一个 docker 镜像,并找到一种通过标签或组织来区分镜像的方法。你会看到像 Dockerhub 上的 arm32v7 组织这样的东西,它保留了一个可爱的 debian 镜像,可以在树莓派上愉快地运行。它相当轻巧,包含了基础镜像所需的东西,因此我决定将它用作我的基础镜像。


第二部分:构建镜像

当然,我可以直接运行 docker 构建。但在树莓派上,编写一个常规的 Dockerfile 进行连续部署时,会出现问题。事实证明,CircleCI 在构建主机列表中没有“Raspberry Pi(树莓派)”选项。经过一些研究,我发现了一个教程,讨论如何安装 Qemu 并通过各种形式的黑魔法将其链接到 docker 的内部。这似乎需要在主机上进行大量配置,这就违背了 docker 的可重复构建的要点。我静下心来,努力想出一个更优雅的解决方案。

在基础层面上,docker 镜像并不关心它所运行的架构。镜像本身只是一个文件系统和一个运行命令的名称。这意味着不需要虚拟机,也不需要在与 Docker 镜像运行的相同架构上进行 docker 构建。这产生了新的构建过程 ——在 x86 CPU(或任何平台上)上构建 docker 镜像,然后在树莓派上运行它。

如何构建 Dockerfile 来进行交叉编译呢?唯一的区别是必须避免使用 RUN 语句 —— 这是因为您运行镜像中的二进制文件有可能无法在您的主机架构上运行 arm 二进制文件。如果没有 RUN 语句,你真正留下的就是 COPY 命令,所以你只需将文件分解为多阶段构建,就可以了。


最终的 Dockerfile 文件

#####################################################

FROM rust:1.27 AS build

# system libraries (for arm)

RUN dpkg --add-architecture armhf

RUN apt-get update

RUN apt-get install -y libpcap0.8-dev:armhf

# cross compile toolchain

RUN rustup target add armv7-unknown-linux-gnueabihf

RUN apt-get install -y gcc-arm-linux-gnueabihf

COPY cargo-config $HOME/.cargo/config

# copy project across

WORKDIR /opt/

COPY src/ src/

COPY Cargo.toml .

COPY Cargo.lock .

# build

RUN cargo build --release --target=armv7-unknown-linux-gnueabihf

#####################################################

# this image is all for ARM - COPY commands are fine but don't RUN anything here

FROM arm32v7/debian:stretch AS run

# system libraries

COPY --from=build /usr/lib/arm-linux-gnueabihf/libpcap.so.0.8 /lib/libpcap.so.0.8

# copy project across

WORKDIR /opt/

COPY --from=build /opt/target/armv7-unknown-linux-gnueabihf/release/program .

# run

ENTRYPOINT /opt/program

#####################################################

第三部分:将持续集成转变为持续部署

到目前为止,所有内容都已设置好,将其推送到 bitbucket 对应于可以在树莓派上运行的新构建工件就可以了。从这里开始,下一个合乎逻辑的步骤是让已部署的树莓派自动拉取该 docker 镜像并开始运行它。为实现这一目标,我用到了 Watchtower。这是一个小程序,可以自动提示 docker 定期下载较新版本的镜像。下一步计划是为这个程序找到或制作一个树莓派兼容的 docker 镜像,并将其添加到 docker-compose 组合文件中。


总 结

那么这个项目的重点在哪里?在CI中设置完整的交叉编译构建,并在推送新代码时自动运行。现在已经有了一个计划,可以让树莓派自动下载并运行该代码。并且管道中唯一的树莓派就是我们运行编译工件的那个,因此其他所有东西都可以移植到通常管道所使用的任何架构中。

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
6月前
|
存储 供应链 物联网
未来科技的融合与创新:区块链、物联网和虚拟现实的交汇点
随着科技的飞速发展,新兴技术正不断重塑我们的世界。本文将深入探讨区块链技术、物联网(IoT)和虚拟现实(VR)三者之间的相互作用,以及它们如何共同推动未来的技术革新和应用变革。我们将分析这些技术的独立发展趋势,并探索它们在交汇时可能产生的独特应用场景和潜在影响,旨在为读者提供一个关于未来科技融合趋势的全景视角。
|
6月前
|
供应链 安全 物联网
未来已来:区块链、物联网与虚拟现实的融合创新
在技术不断演进的今天,区块链、物联网与虚拟现实这三大新兴技术的交汇点正在催生前所未有的应用场景。本文将探讨这些技术各自的发展趋势,并着重分析它们如何相互融合,共同塑造未来的数字世界。我们将深入挖掘它们在金融、医疗和教育等领域的实际运用案例,以及面临的挑战和潜在的解决方案。
|
6月前
|
供应链 安全 物联网
未来已来:探索区块链、物联网与虚拟现实技术的融合趋势与创新应用
随着技术不断演进,新兴技术如区块链、物联网和虚拟现实正日益交织在一起,推动着数字化转型的新浪潮。本文将深入探讨这些技术的发展趋势和应用场景,揭示它们如何相互增强,以及在实际应用中可能遇到的挑战。
|
6月前
|
供应链 数据可视化 物联网
未来技术的脉动:区块链、物联网与虚拟现实的融合与创新
【7月更文挑战第29天】 随着科技的不断进步,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正在逐步渗透到我们的生活中,它们的发展不仅预示着技术革命的新浪潮,也重塑了多个行业的运作模式。本文将深入探讨这些技术的独特发展趋势,并分析它们如何相互融合,创造出前所未有的应用场景。我们将从这些技术的基本概念出发,探索它们在各自领域内的最新应用,并讨论当它们结合时可能产生的革命性影响。通过实际案例分析,本文旨在为读者提供一个全景式的视角,展现这些新兴技术如何共同塑造我们的未来。
|
6月前
|
供应链 安全 物联网
探索未来:区块链、物联网与虚拟现实技术的融合与创新
在数字化浪潮的推动下,新技术如区块链、物联网(IoT)和虚拟现实(VR)正逐渐改变我们的生活和工作方式。本文将深入探讨这些技术的最新发展趋势,分析它们如何相互融合,以及这种融合如何开辟新的应用场景和商业模式。我们将通过具体案例来展示这些技术如何在现实中得到应用,并讨论它们面临的挑战及未来的发展潜力。
|
6月前
|
供应链 物联网 区块链
未来科技的融合与创新:区块链、物联网和虚拟现实的交汇点
【7月更文挑战第25天】在技术不断进步的今天,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正在逐渐改变我们的工作与生活方式。本文将探讨这些技术的发展趋势和它们如何在不同的应用场景中相互融合,共同塑造一个更加智能和互联的未来。
|
6月前
|
供应链 物联网 5G
未来技术的融合与创新:区块链、物联网与虚拟现实的交汇点
【7月更文挑战第26天】在技术不断进步的今天,新兴技术如区块链、物联网和虚拟现实正逐步改变我们的生活和工作方式。本文将探讨这些技术的独特发展趋势,并分析它们如何在未来的应用场景中相互融合与创新,从而带来更加智能、高效和沉浸式的体验。
|
6月前
|
传感器 安全 物联网
未来已来:区块链、物联网与虚拟现实技术的融合与创新
本文旨在探究当前最具革命性的技术趋势——区块链、物联网和虚拟现实。文章不仅剖析了这些技术独立的发展路径,还着重分析了它们相互交织时产生的协同效应。通过具体实例和数据支撑,我们揭示了这些技术如何重塑金融、医疗、教育和娱乐等行业的面貌。最终,文章提出了一个开放性问题,邀请读者思考新兴技术将如何影响个人生活和全球社会结构。
|
6月前
|
供应链 物联网 区块链
探索未来科技的边界:区块链、物联网与虚拟现实的创新融合
在数字化时代的浪潮中,新兴技术如同星辰般点缀着科技的夜空。本文将深入探讨区块链技术、物联网(IoT)以及虚拟现实(VR)等前沿技术的发展趋势与应用前景。我们将从这些技术的核心原理出发,剖析它们如何相互交织,共同塑造未来的数字世界。通过具体案例分析,文章旨在揭示这些技术如何影响我们的日常生活、工作方式以及社会结构。
37 0
|
6月前
|
供应链 安全 物联网
未来技术浪潮:区块链、物联网与虚拟现实的融合与创新
在科技飞速发展的今天,新兴技术的融合与创新正在重塑我们的世界。本文将深入探讨区块链技术、物联网以及虚拟现实这三大技术领域的最新发展趋势和应用场景。我们将分析这些技术如何相互交织,共同推动着智能化、去中心化和沉浸式体验的未来。通过具体案例和数据分析,我们旨在揭示这些技术背后的发展潜力,并展望它们在未来社会中可能扮演的角色。

热门文章

最新文章

相关产品

  • 物联网平台