使用docker搭建嵌入式Linux开发环境

文章目录

1、前言

在日常开发全志、rk等不同平台时,大多数时候只有一个编译主机,但不同sdk所需要的编译环境可能不同。所以本文将记录使用docker为每个平台创建独立的开发环境。

2、安装docker

shell 复制代码
# 1.卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

# 2.安装 Docker 依赖
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release

# 3.添加 Docker 官方 GPG key
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 4.添加 Docker 官方 apt 源
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 5.安装 Docker
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 6.检查是否安装成功
docker --version

3、编写容器管理脚本

找AI写一个脚本,支持创建容器,进入容器,删除容器:

shell 复制代码
#!/bin/bash
# 文件名: sdk_docker.sh
# 用法:
#   创建并启动环境: ./sdk_docker.sh create <chip> <sdk_path>
#   进入环境:         ./sdk_docker.sh enter <chip>
#   删除环境:         ./sdk_docker.sh remove <chip>

ACTION=$1
CHIP=$2
SDK_PATH=$3
IMAGE="ubuntu:22.04"        # 可自行修改,例如某某sdk推荐的ubuntu版本为20.04
CONTAINER_NAME="sdk_${CHIP}_env"

if [[ -z "$ACTION" || -z "$CHIP" ]]; then
    echo "Usage:"
    echo "  $0 create <chip> <sdk_path>"
    echo "  $0 enter <chip>"
    echo "  $0 remove <chip>"
    exit 1
fi

case "$ACTION" in
    create)
        if [[ -z "$SDK_PATH" ]]; then
            echo "Error: SDK path must be provided for create."
            exit 1
        fi

        # 检查镜像是否存在
        if ! docker image inspect $IMAGE >/dev/null 2>&1; then
            echo "Image $IMAGE not found locally. Pulling..."
            docker pull $IMAGE
        fi

        # 判断容器是否已存在
        if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
            echo "Container $CONTAINER_NAME already exists. Starting it..."
            docker start -ai $CONTAINER_NAME
        else
            echo "Creating new container $CONTAINER_NAME..."
            # 容器内挂载路径与宿主机一致
            docker run -it --name $CONTAINER_NAME -v $SDK_PATH:$SDK_PATH $IMAGE /bin/bash
        fi
        ;;
    enter)
        # 进入已有容器
        if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
            # 判断容器是否在运行
            if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
                docker exec -it $CONTAINER_NAME /bin/bash
            else
                echo "Starting container $CONTAINER_NAME..."
                docker start -ai $CONTAINER_NAME
            fi
        else
            echo "Container $CONTAINER_NAME does not exist. Create it first."
            exit 1
        fi
        ;;
    remove)
        # 删除容器
        if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
            docker rm -f $CONTAINER_NAME
            echo "Container $CONTAINER_NAME removed."
        else
            echo "Container $CONTAINER_NAME does not exist."
        fi
        ;;
    *)
        echo "Unknown action: $ACTION"
        exit 1
        ;;
esac

4、创建容器

  1. 例如现在要开发t527,执行如下脚本为t527创建一个独立的容器:
shell 复制代码
# ./sdk_docker.sh create <chip> <sdk_path>
# <chip> : 芯片名称,用于构建容器名称
# <sdk_path> : sdk在宿主机的绝对路径
sudo ./sdk_docker.sh create t527 /mnt/allwinner/t527

创建成功后会自动进入容器,容器中的sdk路径和宿主机的一致。ctrl+d可以退出容器:

  1. 重新进入容器:
shell 复制代码
# ./sdk_docker.sh enter <chip>
sudo ./sdk_docker.sh enter t527
  1. 删除容器
shell 复制代码
# ./sdk_docker.sh remove <chip>
sudo ./sdk_docker.sh remove t527

之后就可以在独立的容器里安装相关的编译环境。各个平台之间互不干扰。

相关推荐
SRE工程师28 分钟前
Docker的端口映射问题(庖丁解牛)
运维·docker·容器
CYRUS_STUDIO1 小时前
使用 readelf 分析 so 文件:ELF 结构解析全攻略
android·linux·逆向
博语小屋1 小时前
回车换行、缓冲区刷新、倒计时小程序
linux
幸运狗头2 小时前
Linux学习-TCP并发服务器构建
linux·服务器·学习
Aurora-silas2 小时前
Docker 入门指南:从基础概念到常见命令及高级工具详解
运维·docker·容器
无聊的HZ2 小时前
docker常用命令有哪些
运维·docker·容器
●VON2 小时前
如何通过docker进行本地部署?
java·docker·容器
轻松Ai享生活2 小时前
udev 从入门到精通,3天学习计划
linux
鸠摩智首席音效师2 小时前
如何清除 Docker 容器的日志 ?
运维·docker·容器