0

Docker容器搭建android编译环境 - 河东西望

 1 year ago
source link: https://www.cnblogs.com/aosp/p/16436863.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Docker容器搭建android编译环境




1 部署容器

1.1 手动部署

1.1.1 配置docker

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

1.1.2 启动容器

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

1.1.3 配置环境

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

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

#!/bin/bash

# 切换容器内apt源
mv /etc/apt/sources.list /etc/apt/sources.list.raw
echo  -e  "deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list

apt-get update
# 安装编译库。需要根据不同的linux系统版本和android版本来配置。详情参看官网。
apt-get install -y -qq --no-install-recommends sudoers vim ssh telnet git repo openjdk-8-jdk
apt-get install -y -qq --no-install-recommends zip unzip flex bc bison rsync gperf gnupg m4 ccache curl genisoimage xsltproc tofrodos
apt-get install -y -qq --no-install-recommends build-essential gcc-multilib g++-multilib
apt-get install -y -qq --no-install-recommends libc6-dev-i386 lib32z-dev lib32ncurses5-dev
apt-get install -y -qq --no-install-recommends dpkg-dev x11proto-core-dev zlib1g-dev
apt-get install -y -qq --no-install-recommends libsdl1.2-dev libx11-dev  libgl1-mesa-dev libgl1-mesa-dev libxml2-utils libssl-dev

# 清除安装缓存,减少容器大小。
apt-get clean
rm -rf /var/lib/apt/lists/*
# 配置环境路径
echo -e "# ++++++++++
# export USER=root
export REPO_URL=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo
# JAVA PATH
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=\${JAVA_HOME}/jre
export CLASSPATH=\${JAVA_HOME}/lib:\${JRE_HOME}/lib
export PATH=\${PATH}:\${JAVA_HOME}/bin" >>  /root/.bashrc
source .bashrc

#
# 配置ssh服务。可以管理员自己来手动操作配置。
# 最好把ssh服务配置为开机启动,这样每次容器启动就可以直接使用ssh服务。
#

# ssh禁止root登陆
# 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

# root password is MUST, 这里设置一个默认密码
# echo 'root:1234' | chpasswd

# 启动ssh服务
# service ssh restart

1.2 Dockerfile

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

FROM ubuntu:18.04

# 根据官网提供的需要安装的编译库
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

# 设置几个环境变量
# 一定要设置USER这个变量,不然AOSP的soong编译报错
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

# 设置root默认密码,配置ssh-server
RUN apt-get install openssh-server \
    && echo 'root:root1234' | chpasswd \  
    && 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

EXPOSE 22
VOLUME ["/opt/externs", "/opt/sdkits"]

# 入口函数。用户自定。
ENTRYPOINT ["starts.sh"]

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

2 镜像管理

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

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

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

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

3 容器管理

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

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

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

3.1 每个用户各用容器

3.1.1 服务端配置

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

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 客户端使用

用户登陆容器:

ssh -p 2201 [email protected]

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

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

3.2 多用户共用容器

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

3.2.1 服务端配置

# 给root设置密码,不让其他人访问。
passwd root

# adduser新增用户及密码1234,并创建/home/user目录
# useradd不会创建/home/user目录

adduser newuser
Adding user `newuser' ...
Adding new group `newuser' (1000) ...
Adding new user `newuser' (1000) with group `newuser' ...
Creating home directory `/home/newuser' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
Changing the user information for newuser
Enter the new value, or press ENTER for the default
	Full Name []: 
	Room Number []: 
	Work Phone []: 
	Home Phone []: 
	Other []: 
Is the information correct? [Y/n]

# 修改/etc/sudoers增加sudo权限
newuser ALL=(ALL:ALL) ALL

3.2.2 客户端使用

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

ssh -p 2201 [email protected]

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK