ubuntu18.04 docker编译容器制作
发表于|更新于
|阅读量:
1.构建
运行以下命令构建,只用运行一次镜像构建,如果修改了 dockerfile 才重新再运行:
docker_build.sh:
1 2 3 4 5 6 7
| #!/bin/bash set -e # 任何一步失败立即退出,不再误报"构建完成" IMAGE_NAME=rk3288-android10-env IMAGE_TAG=latest
docker build -t ${IMAGE_NAME}:${IMAGE_TAG} -f Dockerfile . echo "构建完成: ${IMAGE_NAME}:${IMAGE_TAG}"
|
Dockerfile:
可自行修改添加编译依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| FROM ubuntu:18.04
ENV DEBIAN_FRONTEND=noninteractive ENV TZ=Asia/Shanghai
RUN sed -i 's/ main universe$/ main universe multiverse/' /etc/apt/sources.list \ && dpkg --add-architecture i386 \ && apt-get update && apt-get install -y --no-install-recommends \ git git-core repo curl wget ssh \ gnupg flex bison gperf build-essential make zip unzip rar \ zlib1g-dev zlib1g-dev:i386 lib32z1-dev \ gcc-multilib g++-multilib libc6-dev-i386 \ lib32ncurses5-dev libncurses5 libncurses5-dev \ x11proto-core-dev libx11-dev libgl1-mesa-dev \ libxml2-utils xsltproc m4 bc \ python python-dev python-networkx python3 python3-dev \ openjdk-8-jdk \ lzop libssl-dev liblz4-tool device-tree-compiler u-boot-tools swig cpio \ adb fastboot \ ccache expect gawk texinfo chrpath diffstat \ python3-pyelftools sudo vim less file rsync locales ca-certificates \ passwd tzdata \ && rm -rf /var/lib/apt/lists/*
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN locale-gen en_US.UTF-8 ENV LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
ARG USER_NAME=htx ARG USER_ID=1000 ARG GROUP_ID=1000 RUN groupadd -g ${GROUP_ID} ${USER_NAME} \ && useradd -u ${USER_ID} -g ${GROUP_ID} -m -s /bin/bash ${USER_NAME} \ && echo "${USER_NAME} ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/${USER_NAME} \ && chmod 0440 /etc/sudoers.d/${USER_NAME}
USER ${USER_NAME} ENV HOME=/home/${USER_NAME} WORKDIR /workspace/sdk CMD ["/bin/bash"]
|
2.运行
docker_run.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #!/bin/bash # 用法: ./docker_run.sh -> 以 htx 进入,exit 后自动停止容器 # ./docker_run.sh root -> 以 root 进入,exit 后自动停止容器 CONTAINER_NAME=rk3288-build IMAGE=rk3288-android10-env:latest SDK_DIR=/media/zero/data1/RK_Android_10.0_sdk CCACHE_DIR=${HOME}/.ccache
mkdir -p "${CCACHE_DIR}"
# 首次运行:创建命名容器(不用 --rm,文件系统永久保留) if ! docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then echo "首次运行,创建容器 ${CONTAINER_NAME} ..." docker create -it \ --name ${CONTAINER_NAME} \ --hostname rk3288-build \ -v ${SDK_DIR}:/workspace/sdk \ -v ${CCACHE_DIR}:/home/htx/.ccache \ --net host \ -w /workspace/sdk \ ${IMAGE} fi
# 没在运行则启动 if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then docker start ${CONTAINER_NAME} > /dev/null fi
# 进入容器 if [ "$1" = "root" ]; then docker exec -it -u root -w /workspace/sdk ${CONTAINER_NAME} /bin/bash else docker exec -it -u htx -w /workspace/sdk ${CONTAINER_NAME} /bin/bash fi
# exit 返回宿主机后:自动停止容器 如果需要exit退出容器不停止注释以下两行 docker stop ${CONTAINER_NAME} > /dev/null echo "容器 ${CONTAINER_NAME} 已自动停止(文件系统已保留,下次 ./docker_run.sh 直接恢复)"
|
3.保存导出当前 docker 镜像
docker_save.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #!/bin/bash CONTAINER_NAME=rk3288-build IMAGE=rk3288-android10-env:latest OUT_FILE=rk3288-android10-env_$(date +%Y%m%d).tar.gz
# 关键:先 commit,容器里后来 apt 装的包才会一起保存 if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then echo "提交容器当前状态 -> ${IMAGE}" docker commit ${CONTAINER_NAME} ${IMAGE} fi
echo "导出镜像 -> ${OUT_FILE}" docker save ${IMAGE} | gzip > "${OUT_FILE}" echo "完成,大小: $(du -h "${OUT_FILE}" | cut -f1)" echo "目标机器恢复: docker load -i ${OUT_FILE}"
|
4.日常使用
1 2 3 4 5 6
| sudo -i su - htx
sudo apt-get install -y xxx ./docker_save.sh
|