经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Docker » 查看文章
Docker容器搭建android编译环境的实践记录
来源:jb51  时间:2022/7/4 14:09:49  对本文有异议

1 部署容器

1.1 手动部署

1.1.1 配置docker

  1. # 安装之前必须修改docker路径,防止docker空间增长暴满。
  2. sudo ln -s /opt/docker /var/lib/docker
  3. # 安装docker.io
  4. sudo apt-get install docker.io
  5. # 设置docker命令免root
  6. sudo usermod -aG docker ${whoami}
  7. sudo shutdown -r now

1.1.2 启动容器

  1. # 启动容器ubuntu18.04。android编译环境不宜超过ubuntu18版本,否则问题多多。
  2. # -v 映射容器内地址/opt/aosp/到主机/opt/aosp
  3. # -p 映射容器内ssh端口22到主机2202端口
  4. # -u $(id -u ${USER}):$(id -g ${USER})映射主机用户ID到容器中, 默认为root。
  5. # -d 后台启动容器
  6. docker run -td --name aosp -v /opt/aosp:/opt/aosp -p 2200:22 ubuntu:18.04
  7. # 查看容器
  8. docker ps -a
  9. # 进入容器
  10. docker exec -it aosp /bin/bash

1.1.3 配置环境

进入容器之后,我们就可以安装AOSP的编译环境。不同的AOSP版本安装库可能会有差异,具体可以参考AOSP官网。这里以Android7.1为例。

可以直接将这个脚本放在宿主机的/opt/aosp中,在容器内直接执行:

  1. #!/bin/bash
  2. # 切换容器内apt源
  3. mv /etc/apt/sources.list /etc/apt/sources.list.raw
  4. echo -e "deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
  5. deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
  6. deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
  7. deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
  8. deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
  9. deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
  10. deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
  11. deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
  12. deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
  13. deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
  14. apt-get update
  15. # 安装编译库。需要根据不同的linux系统版本和android版本来配置。详情参看官网。
  16. apt-get install -y -qq --no-install-recommends sudoers vim ssh telnet git repo openjdk-8-jdk
  17. apt-get install -y -qq --no-install-recommends zip unzip flex bc bison rsync gperf gnupg m4 ccache curl genisoimage xsltproc tofrodos
  18. apt-get install -y -qq --no-install-recommends build-essential gcc-multilib g++-multilib
  19. apt-get install -y -qq --no-install-recommends libc6-dev-i386 lib32z-dev lib32ncurses5-dev
  20. apt-get install -y -qq --no-install-recommends dpkg-dev x11proto-core-dev zlib1g-dev
  21. apt-get install -y -qq --no-install-recommends libsdl1.2-dev libx11-dev libgl1-mesa-dev libgl1-mesa-dev libxml2-utils libssl-dev
  22. # 清除安装缓存,减少容器大小。
  23. apt-get clean
  24. rm -rf /var/lib/apt/lists/*
  25. # 配置环境路径
  26. echo -e "# ++++++++++
  27. # export USER=root
  28. export REPO_URL=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo
  29. # JAVA PATH
  30. export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
  31. export JRE_HOME=\${JAVA_HOME}/jre
  32. export CLASSPATH=\${JAVA_HOME}/lib:\${JRE_HOME}/lib
  33. export PATH=\${PATH}:\${JAVA_HOME}/bin" >> /root/.bashrc
  34. source .bashrc
  35. #
  36. # 配置ssh服务。可以管理员自己来手动操作配置。
  37. # 最好把ssh服务配置为开机启动,这样每次容器启动就可以直接使用ssh服务。
  38. #
  39. # ssh禁止root登陆
  40. # sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
  41. # sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/g' /etc/ssh/sshd_config
  42. # root password is MUST, 这里设置一个默认密码
  43. # echo 'root:1234' | chpasswd
  44. # 启动ssh服务
  45. # service ssh restart

折叠

1.2 Dockerfile

这里有一个参考脚本,根据android官网提供的脚本修改。

  1. FROM ubuntu:18.04
  2. # 根据官网提供的需要安装的编译库
  3. RUN apt-get update && apt-get install -y -qq --no-install-recommends zip unzip flex bc rsync bison gperf gnupg m4 ccache curl genisoimage xsltproc tofrodos build-essential gcc-multilib g++-multilib libc6-dev-i386 lib32z-dev lib32ncurses5-dev kmod dpkg-dev x11proto-core-dev zlib1g-dev libsdl1.2-dev libx11-dev libgl1-mesa-dev libgl1-mesa-dev libxml2-utils libssl-dev
  4. # 设置几个环境变量
  5. # 一定要设置USER这个变量,不然AOSP的soong编译报错
  6. RUN apt-get install -y -qq --no-install-recommends vim git repo openjdk-8-jdk && echo "# ++++++++++++++++++++++++++++++++++++++++" >> /etc/profile && echo "export USER=root" >> /etc/profile && echo "export REPO_URL=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo" >> /etc/profile && echo "export HEXAGON_ROOT=/opt/sdkits/qcom/hexagon" >> /etc/profile && echo "# JAVA PATH" >> /etc/profile && echo "export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64" >> /etc/profile && echo "export JRE_HOME=\${JAVA_HOME}/jre" >> /etc/profile && echo "export CLASSPATH=\${JAVA_HOME}/lib:\${JRE_HOME}/lib" >> /etc/profile && echo "export PATH=\${PATH}:\${JAVA_HOME}/bin" >> /etc/profile
  7. # 设置root默认密码,配置ssh-server
  8. RUN apt-get install openssh-server && echo 'root:root1234' | chpasswd \
  9. && sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config && sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/g' /etc/ssh/sshd_config
  10. EXPOSE 22
  11. VOLUME ["/opt/externs", "/opt/sdkits"]
  12. # 入口函数。用户自定。
  13. ENTRYPOINT ["starts.sh"]

Dockerfile编译运行的时间太长了,我一般不用这个操作。

2 镜像管理

我们需要将这个镜像提交成标准镜像,作为基础环境公用。

  1. docker commit -a "newuser" -m "aosp imange based on ubuntu18.04" <CONTAINER_ID> xxx/aosp:v1.0?

如有必要,还需要导出镜像文件备用:

  1. ## 保存镜像
  2. docker save -o ~/Download/aospbase-v1.0.tar xxx/aospbase:v1.0
  3. ## 加载镜像
  4. docker load -i ~/Download/aospbase-v1.o.tar

3 容器管理

在实际的团队开发管理中,我们需要考虑分配容器给团队成员使用。分配容器的方式有两种:

  • 每个用户分配一个容器,容器通过端口号来区分。
  • 所有用户共用一个基础容器,按照用户名来使用。

不建议使用IP地址的方式是因为需要固定容器IP地址,这在企业局域网内限制比较多,很多非技术层面的问题比较复杂。

3.1 每个用户各用容器

3.1.1 服务端配置

每个用户需要配置一个独立的容器。每个容器以端口号(而不是以IP地址)来进行区分。

  1. docker run -td --name YOURNAME -v /opt/dockerdirs/YOURNAME:/opt/aosp -p 2221:22 xxx/aospbase:v1 bin/bash

需要配置的几个参数:
1、容器名称:--name YOURNAME,修改成:用户名称-镜像-id
2、host挂载目录:/opt/dockerdirs/YOURNAME, 按照用户名归类,防止目录混乱。
3、ssh端口:2201:22, 建议从2220 ~ 2299进行分配。

3.1.2 客户端使用

用户登陆容器:

  1. ssh -p 2201 root@192.168.1.1

默认用户: root
默认密码: root1234

使用说明:
1、务必把资料信息保存在/opt/externs目录中,docker崩溃之后文件不会丢失。
2、不要停止掉ssh服务,否则无法进入docker容器。
3、容器默认没有UI界面和桌面程序。 如果需要安装UI界面和工具,请自己安装X11或者ubuntu-desktop。可以自己在容器内进行安装操作。
4、不要把编译服务器用来存储文件备份等。容器一旦超过一定大小,会被管理员清空删除。

3.2 多用户共用容器

多个用户共用同一个容器,容器就需要配置多用户。每个容器的root用户是不能提供给用户使用的。

3.2.1 服务端配置

  1. # 给root设置密码,不让其他人访问。
  2. passwd root
  3. # adduser新增用户及密码1234,并创建/home/user目录
  4. # useradd不会创建/home/user目录
  5. adduser newuser
  6. Adding user `newuser' ...
  7. Adding new group `newuser' (1000) ...
  8. Adding new user `newuser' (1000) with group `newuser' ...
  9. Creating home directory `/home/newuser' ...
  10. Copying files from `/etc/skel' ...
  11. Enter new UNIX password:
  12. Retype new UNIX password:
  13. passwd: password updated successfully
  14. Changing the user information for newuser
  15. Enter the new value, or press ENTER for the default
  16. Full Name []:
  17. Room Number []:
  18. Work Phone []:
  19. Home Phone []:
  20. Other []:
  21. Is the information correct? [Y/n]
  22. # 修改/etc/sudoers增加sudo权限
  23. newuser ALL=(ALL:ALL) ALL

3.2.2 客户端使用

用户登陆容器,使用的是公共端口,但是用户名各不相同:

  1. ssh -p 2201 newuser@192.168.1.1

到此这篇关于Docker容器搭建android编译环境的文章就介绍到这了,更多相关Docker android编译环境内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号