Loading... ### 创建docker image 首先安装docker环境,参考[Setup ubuntu server 20.04 for machine learning->2.1 docker](https://www.helloyiyu.com/index.php/ai/28.html) 抓取ubuntu docker image作为基础镜像,并使用交互运行方式登录到docker ubuntu环境中 ```shell docker run -it ubuntu:20.04 bash ``` 安装必要的环境 ```shell root@4fe074e57b3b:/# sudo apt-get update root@4fe074e57b3b:/# apt-get update root@4fe074e57b3b:/# apt-get install gcc make wget ``` 创建用户,与宿主机的用户UID和GID保持一致,避免后续使用时有文件权限问题 ```shell root@4fe074e57b3b:/# groupadd -g 1000 yiyu root@4fe074e57b3b:/# useradd -u 1000 -g yiyu yiyu ``` 创建用户home目录,下载stm32交叉编译工具 ```shell root@4fe074e57b3b:/# mkdir /home/yiyu root@4fe074e57b3b:/# cd /home/yiyu root@4fe074e57b3b:/home/yiyu# wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2?rev=78196d3461ba4c9089a67b5f33edf82a&hash=D484B37FF37D6FC3597EBE2877FB666A41D5253B root@4fe074e57b3b:/home/yiyu# tar -jxvf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 root@4fe074e57b3b:/home/yiyu# rm gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 root@4fe074e57b3b:/home/yiyu# chown -R yiyu:yiyu /home/yiyu root@4fe074e57b3b:/home/yiyu# mkdir code root@4fe074e57b3b:/home/yiyu# cd code root@4fe074e57b3b:/home/yiyu/code# pwd /home/yiyu/code ``` 现在已经准备好编译环境,我们需要切换成yiyu用户,设置PATH,然后将当前环境保存为新的docker image ```shell root@4fe074e57b3b:/home/yiyu/code# su yiyu $ pwd /home/yiyu/code $ export PATH=$PATH:/home/yiyu/gcc-arm-none-eabi-10.3-2021.10/bin ``` 保持当前docker依然在运行,另外启动一个shell在宿主机中保存当前docker image ```shell #首先查看当前运行的容器ID (base) yiyu@eastforest:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4fe074e57b3b ubuntu:20.04 "bash" 36 minutes ago Up 36 minutes busy_shockley #然后基于当前ID创建新的docker image yiyu@eastforest:~$ docker commit -m "install arm_gcc, gcc, make" -a "yiyu" 4fe074e57b3b ubuntu:stm32_dev sha256:5d7405a35b36f099f01ad8f738a4406f4252f0a3decc6ed0e9ac0abab7a07322 ``` 现在,已经保存了一个新的名为“ubuntu:stm32_dev”的docker image ### 使用docker image编译宿主机代码 ```shell (base) yiyu@eastforest:~$ mkdir test (base) yiyu@eastforest:~$ cd test (base) yiyu@eastforest:~/test$ cat main.c #include <stdio.h> int main(void) { printf("hello world!\n"); return 0; } (base) yiyu@eastforest:~/test$ docker run --rm -it -u yiyu -v "$PWD":/home/yiyu/code -w /home/yiyu/code ubuntu:stm32_dev bash yiyu@b519687858a1:~/code$ gcc main.c -o main yiyu@b519687858a1:~/code$ exit exit (base) yiyu@eastforest:~/test$ ls main main.c ``` 当在宿主机中准备好代码以后,将当前路径作为工作路径,启动ubuntu:stm32_dev镜像,并在bash中执行编译动作然后退出,可以看到宿主机中已经出现编译产物。 为了减少每次输入一长串指令,可以设置alias ```shell (base) yiyu@eastforest:~/test$ cat ~/.bash_aliases alias docker32='docker run --rm -it -u yiyu -v "$PWD":/home/yiyu/code -w /home/yiyu/code ubuntu:stm32_dev bash' (base) yiyu@eastforest:~$ source ~/.bashrc (base) yiyu@eastforest:~$ alias alias docker32='docker run --rm -it -u yiyu -v "$PWD":/home/yiyu/code -w /home/yiyu/code ubuntu:stm32_dev bash' ``` 这样每次要编译时,只需要执行`docker32`,编译完在退出到宿主机 ```shell (base) yiyu@eastforest:~/test$ ls main.c (base) yiyu@eastforest:~/test$ docker32 yiyu@b519687858a1:~/code$ ls main.c yiyu@b519687858a1:~/code$ gcc main.c -o main yiyu@b519687858a1:~/code$ exit exit (base) yiyu@eastforest:~/test$ ls main main.c ``` 最后修改:2024 年 06 月 02 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏