干货|从零开始学习制作、以及使用Tina的Docker编译镜像

原创 电子工程世界 2022-09-01 07:30

前言

菜鸡玩家第一次接触Linux的buildroot环境,还在熟悉中。对于长期使用Linux命令行的、熟悉OpenHarmony构建系统的人来说,更清楚编译环境对小白来说有多蛋疼。作为一个重度的docker环境使用者,以及小白折腾编译环境的劝退佬来说,有一句话特别想对想学Linux的小白说。

本次制作镜像所需的文件已打包放在附件,想直接使用的,可以直接从第2节 创建docker镜像开始。不想自己制作的,可以从第3节 创建docker容器开始。


你有空去折腾Linux的编译环境,还不如来学学Docker镜像的制作


用docker制作编译环境的好处

  1. docker镜像的制作脚本,可以添加注释,作为学习过程记录和知识积累。

  2. 学习docker镜像制作,能更好的理解Linux权限

  3. 加深对系统目录的理解

  4. 重装系统时,不需要浪费大量时间回忆环境搭建过程

  5. docker容器玩坏了没关系,重新用镜像创建一个新的就行

  6. 工具链更新时,可以通过快速调整制作脚本快速升级环境

  7. 启动快速,培养命令行使用习惯


docker的缺点

  1. win下不能调用USB设备(无法直接烧录)

  2. docker需要学习和理解(基本上花2小时在B站看一下入门教程即可)

  3. 重度命令行工具(使用命令行完成几乎所有操作)


开始学习制作docker镜像

准备工作:安装docker(百度很多教程,没啥好说,不废话),然后将附件里的压缩包解压缩到任意目录,在命令行中进入该目录下。

1、编制制作脚本文件tina_env.dockfile。
这里我已经制作好了,实际上脚本也没什么复杂的东西。简单来说,也就是FROM命令指定镜像的基础包。ENV命令设置镜像的环境变量。WORKDIR命令设置进入容器的默认路径(本镜像默认把源码挂载在/mnt目录,所以工作区也设置为该路径)。COPY命令将主机目录的内容复制到镜像内。RUN命令会在构建镜像时进入镜像环境中执行相关的Linux指令(比方说给镜像安装指定的软件包,文件的处理等)。
我们看一下本次制作tina_env的脚本文件。文件开头可以看到以下内容(均有注释,就不一一解释了):

  1.   # 使用python2.7的精简版debian镜像作为基础

  2. FROM python:2.7-slim-buster

  3.   # 调整时区

  4. ENV TZ "Asia/Shanghai"

  5.   # 设置默认工作路径

  6. WORKDIR /mnt

  7.   # 拷贝主机的目录内容(.bashrc以及可执行的repo程序)到镜像内

  8. COPY Docker/vuser//root/

  9. # 添加普通用户组

  10. RUN groupadd -g 1000 tina && \

  11. # 添加普通用户

  12. useradd vuser -r -m --uid 1000 -g tina --shell /bin/bash && \

  13. # 复制Powerline至/usr/bin目录,并调整权限

  14. mv /root/powerline-go /usr/bin/powerline-go && chmod 755 /usr/bin/powerline-go && \

  15. # 为root用户添加python国内源

  16. mkdir ~/.pip && \

  17. echo '[global]' >> ~/.pip/pip.conf && \

  18. echo 'index-url = https://pypi.tuna.tsinghua.edu.cn/simple' >> ~/.pip/pip.conf && \

  19. echo '[install]' >> ~/.pip/pip.conf && \

  20. echo 'trusted-host = https://pypi.tuna.tsinghua.edu.cn' >> ~/.pip/pip.conf && \

  21. # 复制pip国内源配置至普通用户

  22. cp -rv ~/.pip /home/vuser/ && chown -R vuser:tina /home/vuser/.pip && \

  23. # 修改系统软件包国内源

  24. sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && \

  25. sed -i 's/security.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && \

  26. # 添加 i386 环境支持

  27. dpkg --add-architecture i386 && \

  28. apt-get update && apt-get install apt-utils -y && \

  29. # 安装常见软件库

  30. apt-get install curl wget pv git lbzip2 libncurses5 libncursesw5 nano -y && \

  31. # 安装buildroot 必须依赖的软件库

  32. apt-get install sed gawk make binutils diffutils gcc g++ bash patch gzip bzip2 perl \

  33. tar cpio unzip rsync bc gawk libncurses-dev libssl-dev zlib1g-dev xz-utils file -y && \

  34. # 安装 i386环境支持库

  35. apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 busybox rsync lzma -y && \

  36. # 清理缓存,减少镜像体积

  37. apt-get clean && \

  38. # 复制bashrc配置文件到vuser用户

  39. cd /root && cp .bashrc .bash_aliases /home/vuser/ && chown -R vuser:tina /home/vuser && \

  40. # 创建工具链目录

  41. mkdir /opt/toolchains && chmod 666 /opt/toolchains

  42. # 容器创建后,默认登陆以bash作为登陆环境

  43. CMD ["/bin/bash"]

2、创建docker镜像
在磁盘的任意位置创建一个任意目录(比如docker_build), 然后把附件的压缩包解压缩到这个目录里,然后用命令行进入这个目录(docker_build)。在命令行中执行以下命令(需要将walker2048替换成你自己的dockerhub用户名):

  1. docker build -t walker2048/tina_env -f Docker/tina_env.dockerfile --network host  .

命令解析:
build参数:告诉docker要执行创建镜像的工作
-t walker2048/tina_env 参数:告诉docker这个镜像的tag标签(walker2048/tina_env)。可以理解成镜像的标识符(类似地址和姓名),这个tag标签是可以修改的,把镜像上传到dockerhub上也需要指定正确的标签。
-f Docker/tina_env.dockerfile 参数:告诉docker使用哪一个构建脚本(可以使用绝对路径和相对路径)
—network host参数:告诉docker使用主机的网络配置
最后的. 参数:将当前目录的所有内容传递给docker作为临时输入内容(COPY命令需要使用)。


正确执行命令后,网络正常的情况下,大概只需要5分钟左右,就顺利完成镜像构建了。命令行输出输出类似下图:

  1. Sending build context to Docker daemon  95.64MB

  2. Step 1/7 : FROM python:2.7-slim-buster

  3.  ---> eeb27ee6b893

  4. Step 2/7 : ENV TZ "Asia/Shanghai"

  5.  ---> Using cache

  6.  ---> 0c0e432b82be

  7. Step 3/7 : WORKDIR /mnt

  8.  ---> Using cache

  9.  ---> 0d54e5487ee3

  10. Step 4/7 : COPY Docker/vuser//root/

  11. ---> Using cache

  12. ---> 3e1598cc56a3

  13. Step 5/7 : COPY Docker/bin//usr/bin/

  14. ---> Using cache

  15. ---> 40895711f1dc

  16. Step 6/7 : RUN groupadd -g 1000 tina && useradd vuser -r -m --uid 1000 -g tina --shell /bin/bash && mv /root/powerline-go /usr/bin/powerline-go && chmod 755 /usr/bin/powerline-go && mkdir ~/.pip &&  echo '[global]'

  17. >> ~/.pip/pip.conf && echo 'index-url = https://pypi.tuna.tsinghua.edu.cn/simple' >> ~/.pip/pip.conf && echo '[install]' >> ~/.pip/pip.conf && echo 'trusted-host = https://pypi.tuna.tsinghua.edu.cn' >> ~/.pip/pip.conf

  18. && cp -rv ~/.pip /home/vuser/ && chown -R vuser:tina /home/vuser/.pip && sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && sed -i 's/security.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && dpkg --add-architecture i386 && apt-get update && apt-get install apt-utils -y && apt-get install curl wget patch pv git zip lbzip2 libncurses5 libncursesw5 nano -y && apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 busybox rsync lzma -y && apt-get clean && cd /root && cp .bashrc .bash_aliases /home/vuser/ && chown -R vuser:tina /home/vuser && mkdir /opt/toolchains && chmod 666 /opt/toolchains

  19. ##

  20. 篇幅原因,中间省略各种软件源更新和软件包安装的内容

  21. ## 

  22. ---> Using cache

  23. ---> 3a44cb328437

  24. Step 7/7 : CMD ["/bin/bash"]

  25. ---> Using cache

  26. ---> 6b65b7402ecd

  27. Successfully built 6b65b7402ecd

  28. Successfully tagged walker2048/tina_env:latest

当我们看到所有的步骤(Step)都正确执行了,最后也成功生成了镜像的时候,就可以开始下一步创建docker容器了。

3、创建docker容器
创建容器前,需要先理解一下创建容器的一些基础知识。
3.1 容器类似独立的虚拟机,除了挂载上去的目录,文件系统和寄主机是不相通的。
3.2 可以创建名称不同的、但是使用的镜像相同的容器。容器间是独立的关系。
3.3 容器网络使用方式需要指定,一般编译服务器无特殊要求的,可以直接指定使用host网络。
3.4 如果是Linux系统,想让docker容器访问USB设备,可以使用—privileged参数开启。
3.5 创建容器(虚拟机)后,下次使用不需要重新创建。

Linux或者Bash环境使用以下命令

  1. docker run -it --name tina_build \

  2.   --net=host \

  3.   --privileged \

  4.   -/mnt/IoT:/mnt \

  5. walker2048/tina_env

Windows环境使用以下命令

  1. docker run -it --name tina_build --net=host -/mnt/IoT:/mnt walker2048/tina_env

参数解析:
run 参数:告诉docker需要创建容器
-it 参数:创建完毕后自动运行容器时,使用命令行交互方式运行(开启这个参数才能使用命令行交互)
—name tina_build 参数:告诉docker把这个容器命名为tina_build(后期运行容器需要使用这个)
—net=host 参数:指定容器的网络模式为host模式(和主机同一个网络)
—privileged 参数:特权模式,Linux环境下才有用,开启后可以访问USB设备
-v /mnt/IoT:/mnt 参数:挂载寄主机的/mnt/IoT目录到容器的/mnt目录(都需要使用绝对路径,文件双方共享,可读写)
walker2048/tina_env 参数:告诉docker使用哪个镜像来创建容器。

进入容器后,命令行提示内容如下(容器默认使用了powerline-go,简单美化了一下):


repo程序需要配置用户信息,所以只能自行配置和安装 #docker# 。
此时需要给vuser用户添加密码(只需要执行一次,没有密码不能使用login命令切换用户),在容器的命令行输入

passwd vuser

然后就可以用login命令切换到vuser用户了。切换用户后就可以按Tina SDK的说明下载和编译源码了(为什么要切换用户,因为和寄主机子共享了目录,如果寄主机子是Linux环境,用root用户操作会影响寄主机对目录的读写)。保持良好的用户习惯是个好事儿。一般情况下,Linux环境的常规用户ID是1000开始的。

4、退出容器和重新运行环境的方法。
4.1 退出容器。
在容器命令行输入exit(如果之前用root用户进入容器,然后使用login命令切换用户的,需要退出至少两次)。或者直接关闭命令行。
4.2 容器未停止时进入容器的方式(-u 参数指定用户为root或者vuser):

docker exec -it -u root tina_build bash

若命令行提示容器为停止状态(或者寄主机重启过),需要先使用以下命令开启容器。

docker start tina_build

也可以通过-d参数,告诉docker以守护形式长时间开启容器(直到使用命令行关闭或者寄主机关机)

本次分享的内容就是这些,希望能帮助到有需要的朋友。

推荐阅读

干货|想看懂示波器眼图,这4点必须搞清楚
干货|磁环选型攻略及EMC整改技巧
干货 | 同步BUCK降压变换器开关节点负压尖峰及影响
干货 | 单片机main函数结束干嘛去了?

添加微信回复“进群”

拉你进技术交流群!

国产芯|汽车电子|物联网|新能源|电源|工业|嵌入式…..  

众号内回复您想搜索的任意内容,如问题关键字、技术名词、bug代码等,就能轻松获得与之相关的专业技术内容反馈。快去试试吧!


如果您想经常看到我们的文章,可以进入我们的主页,点击屏幕右上角“三个小点”,点击“设为星标”。

欢迎扫码关注


电子工程世界 关注EEWORLD电子工程世界,即时参与讨论电子工程世界最火话题,抢先知晓电子工程业界资讯。
评论
  • 随着工业自动化和智能化的发展,电机控制系统正向更高精度、更快响应和更高稳定性的方向发展。高速光耦作为一种电气隔离与信号传输的核心器件,在现代电机控制中扮演着至关重要的角色。本文将详细介绍高速光耦在电机控制中的应用优势及其在实际工控系统中的重要性。高速光耦的基本原理及优势高速光耦是一种光电耦合器件,通过光信号传递电信号,实现输入输出端的电气隔离。这种隔离可以有效保护电路免受高压、电流浪涌等干扰。相比传统的光耦,高速光耦具备更快的响应速度,通常可以达到几百纳秒到几微秒级别的传输延迟。电气隔离:高速光
    晶台光耦 2024-12-20 10:18 137浏览
  • //```c #include "..\..\comm\AI8051U.h"  // 包含头文件,定义了硬件寄存器和常量 #include "stdio.h"              // 标准输入输出库 #include "intrins.h"         &n
    丙丁先生 2024-12-20 10:18 84浏览
  • 耳机虽看似一个简单的设备,但不仅只是听音乐功能,它已经成为日常生活和专业领域中不可或缺的一部分。从个人娱乐到专业录音,再到公共和私人通讯,耳机的使用无处不在。使用高质量的耳机不仅可以提供优良的声音体验,还能在长时间使用中保护使用者听力健康。耳机产品的质量,除了验证产品是否符合法规标准,也能透过全面性的测试和认证过程,确保耳机在各方面:从音质到耐用性,再到用户舒适度,都能达到或超越行业标准。这不仅保护了消费者的投资,也提升了该公司在整个行业的产品质量和信誉!客户面临到的各种困难一家耳机制造商想要透
    百佳泰测试实验室 2024-12-20 10:37 145浏览
  • Supernode与艾迈斯欧司朗携手,通过Belago红外LED实现精准扫地机器人避障;得益于Belago出色的红外补光功能,使扫地机器人能够大大提升其识别物体的能力,实现精准避障;Belago点阵照明器采用迷你封装,兼容标准无铅回流工艺,适用于各种3D传感平台,包括移动设备、物联网设备和机器人。全球领先的光学解决方案供应商艾迈斯欧司朗(瑞士证券交易所股票代码:AMS)近日宣布,与国内领先的多行业三维视觉方案提供商超节点创新科技(Supernode)双方联合推出采用艾迈斯欧司朗先进Belago红
    艾迈斯欧司朗 2024-12-20 18:55 65浏览
  • 国产数字隔离器已成为现代电子产品中的关键部件,以增强的性能和可靠性取代了传统的光耦合器。这些隔离器广泛应用于医疗设备、汽车电子、工业自动化和其他需要强大信号隔离的领域。准确测试这些设备是确保其质量和性能的基本步骤。如何测试数字隔离器测试数字隔离器需要精度和正确的工具集来评估其在各种条件下的功能和性能。以下设备对于这项任务至关重要:示波器:用于可视化信号波形并测量时序特性,如传播延迟、上升时间和下降时间。允许验证输入输出信号的完整性。频谱分析仪:测量电磁干扰(EMI)和其他频域特性。有助于识别信号
    克里雅半导体科技 2024-12-20 16:35 59浏览
  • ALINX 正式发布 AMD Virtex UltraScale+ 系列 FPGA PCIe 3.0 综合开发平台 AXVU13P!这款搭载 AMD 16nm 工艺 XCVU13P 芯片的高性能开发验证平台,凭借卓越的计算能力和灵活的扩展性,专为应对复杂应用场景和高带宽需求而设计,助力技术开发者加速产品创新与部署。随着 5G、人工智能和高性能计算等领域的迅猛发展,各行业对计算能力、灵活性和高速数据传输的需求持续攀升。FPGA 凭借其高度可编程性和实时并行处理能力,已成为解决行业痛点的关
    ALINX 2024-12-20 17:44 70浏览
  • 光耦合器,也称为光隔离器,是用于电气隔离和信号传输的多功能组件。其应用之一是测量电路中的电压。本文介绍了如何利用光耦合器进行电压测量,阐明了其操作和实际用途。使用光耦合器进行电压测量的工作原理使用光耦合器进行电压测量依赖于其在通过光传输信号的同时隔离输入和输出电路的能力。该过程包括:连接到电压源光耦合器连接在电压源上。输入电压施加到光耦合器的LED,LED发出的光与施加的电压成比例。光电二极管响应LED发出的光由输出侧的光电二极管或光电晶体管检测。随着LED亮度的变化,光电二极管的电阻相应减小,
    腾恩科技-彭工 2024-12-20 16:31 55浏览
  • 汽车行业的变革正愈演愈烈,由交通工具到“第三生活空间”。业内逐渐凝聚共识:汽车的下半场在于智能化。而智能化的核心在于集成先进的传感器,以实现高等级的智能驾驶乃至自动驾驶,以及更个性、舒适、交互体验更优的智能座舱。毕马威中国《聚焦电动化下半场 智能座舱白皮书》数据指出,2026年中国智能座舱市场规模将达到2127亿元,5年复合增长率超过17%。2022年到2026年,智能座舱渗透率将从59%上升至82%。近日,在SENSOR CHINA与琻捷电子联合举办的“汽车传感系列交流会-智能传感专场”上,艾
    艾迈斯欧司朗 2024-12-20 19:45 77浏览
  • 百佳泰特为您整理2024年12月各大Logo的最新规格信息。——————————USB▶ 百佳泰获授权进行 USB Active Cable 认证。▶ 所有符合 USB PD 3.2 标准的产品都有资格获得USB-IF 认证——————————Bluetooth®▶ Remote UPF Testing针对所有低功耗音频(LE Audio)和网格(Mesh)规范的远程互操作性测试已开放,蓝牙会员可使用该测试,这是随时测试产品的又一绝佳途径。——————————PCI Express▶ 2025年
    百佳泰测试实验室 2024-12-20 10:33 113浏览
  • 光耦固态继电器(SSR)作为现代电子控制系统中不可或缺的关键组件,正逐步取代传统机械继电器。通过利用光耦合技术,SSR不仅能够提供更高的可靠性,还能适应更加复杂和严苛的应用环境。在本文中,我们将深入探讨光耦固态继电器的工作原理、优势、挑战以及未来发展趋势。光耦固态继电器:如何工作并打破传统继电器的局限?光耦固态继电器通过光电隔离技术,实现输入信号与负载之间的电气隔离。其工作原理包括三个关键步骤:光激活:LED接收输入电流并发出与其成比例的光信号。光传输:光电传感器(如光电二极管或光电晶体管)接收
    腾恩科技-彭工 2024-12-20 16:30 46浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦