04_apollo_docker子模块整体软件架构深入分析文档

04_apollo_docker子模块整体软件架构深入分析文档

1. 概述

Apollo Docker子模块是Apollo自动驾驶平台的容器化解决方案,提供完整的开发、构建和运行环境。采用分层架构设计,支持多平台(x86_64、aarch64)和多种硬件加速,实现开发环境一致性与可移植性,简化平台部署维护流程,为开发者提供高效可靠的开发体验。

2. 软件架构图

graph TB subgraph "Docker子模块" subgraph "构建系统" B1[Dockerfile定义]:::key B2[安装脚本]:::key B3[配置文件]:::key end subgraph "开发环境" D1[基础镜像] D2[Cyber镜像] D3[开发镜像]:::key end subgraph "运行时环境" R1[运行时镜像] R2[独立运行镜像] end subgraph "辅助工具" T1[开发工具脚本]:::key T2[主机配置工具]:::key T3[资源清理工具]:::key end end subgraph "外部依赖" E1[Docker引擎]:::key E2[CUDA驱动] E3[系统库] end B1 --> D1 B2 --> D1 B3 --> D1 D1 --> D2 D2 --> D3 D3 --> R1 R1 --> R2 T1 --> D3 T2 --> E1 T3 --> E1 E1 --> D1 E2 --> D1 E3 --> D1 classDef key fill:#e1f5fe

3. 调用流程图

Apollo Docker子模块的调用流程涵盖了从环境准备到系统运行的完整生命周期,包括Docker引擎安装、镜像构建、容器启动和项目开发等多个阶段。整个流程设计清晰,步骤明确,便于开发者理解和使用。

3.1. Docker环境准备流程

sequenceDiagram participant User as 开发者 participant Host as 主机系统 participant Docker as Docker引擎 participant Repo as Docker仓库 User->>Host: 执行docker setup脚本 Host->>Host: 检查系统版本 Host->>Host: 验证硬件配置 Host->>Host: 安装必要依赖 Host->>Docker: 下载Docker安装包 Docker-->>Host: 安装包下载完成 Host->>Docker: 安装Docker引擎 Docker-->>Host: 安装完成 Host->>Docker: 配置Docker服务 Docker-->>Host: 配置完成 Host->>Repo: 配置Docker镜像源 Repo-->>Host: 配置完成 Host-->>User: Docker环境准备完成

3.2. Docker镜像构建流程

sequenceDiagram participant User as 开发者 participant Host as 主机系统 participant Build as 构建系统 participant Docker as Docker引擎 participant Env as 环境配置 User->>Host: 执行build_docker.sh Host->>Build: 启动构建流程 Build->>Build: 解析命令行参数 Build->>Build: 验证参数有效性 Build->>Env: 加载环境配置 Env-->>Build: 配置加载完成 Build->>Build: 检查系统依赖 Build->>Host: 获取系统信息 Host-->>Build: 系统信息返回 Build->>Build: 生成构建配置 Build->>Build: 加载Dockerfile Build->>Build: 执行安装脚本 Build->>Build: 配置环境变量 Build->>Docker: 构建基础镜像 Docker->>Docker: 执行构建步骤 Docker-->>Build: 基础镜像构建完成 Build->>Docker: 构建Cyber镜像 Docker->>Docker: 执行构建步骤 Docker-->>Build: Cyber镜像构建完成 Build->>Docker: 构建开发镜像 Docker->>Docker: 执行构建步骤 Docker-->>Build: 开发镜像构建完成 Build->>Docker: 构建运行时镜像 Docker->>Docker: 执行构建步骤 Docker-->>Build: 运行时镜像构建完成 Build-->>Host: 构建流程完成 Host-->>User: 镜像构建完成

3.3. 开发容器启动流程

sequenceDiagram participant User as 开发者 participant Host as 主机系统 participant Docker as Docker引擎 participant Env as 开发环境 User->>Host: 执行dev_start.sh Host->>Docker: 检查Docker服务状态 Docker-->>Host: 服务状态返回 Host->>Docker: 检查开发镜像是否存在 Docker-->>Host: 镜像状态返回 Host->>Docker: 检查容器是否已存在 Docker-->>Host: 容器状态返回 alt 容器已存在 Host->>Docker: 启动现有容器 Docker-->>Host: 容器启动完成 else 容器不存在 Host->>Docker: 创建开发容器 Docker->>Docker: 配置容器参数 Docker->>Docker: 挂载工作目录 Docker->>Docker: 配置网络 Docker->>Docker: 设置环境变量 Docker->>Docker: 启动容器 Docker-->>Host: 容器创建完成 end Host->>Env: 初始化开发环境 Env->>Env: 加载环境配置 Env->>Env: 配置Bazel构建系统 Env->>Env: 配置CyberRT框架 Env->>Env: 配置开发工具 Env-->>Host: 环境初始化完成 Host-->>User: 开发环境就绪

3.4. Apollo项目开发流程

sequenceDiagram participant User as 开发者 participant Host as 主机系统 participant Env as 开发环境 participant Build as Bazel构建系统 participant Cyber as CyberRT框架 participant Runtime as 运行时环境 User->>Host: 执行dev_into.sh Host->>Env: 进入开发容器 Env-->>User: 容器终端就绪 User->>Env: 编辑Apollo源码 User->>Env: 执行bazel build命令 Env->>Build: 启动构建流程 Build->>Build: 解析构建配置 Build->>Build: 检查依赖 Build->>Build: 执行构建步骤 Build->>Cyber: 编译CyberRT组件 Cyber-->>Build: 编译完成 Build->>Build: 生成可执行文件 Build-->>Env: 构建完成 Env-->>User: 构建结果返回 User->>Env: 执行运行时测试 Env->>Runtime: 启动运行时环境 Runtime->>Runtime: 初始化组件 Runtime->>Runtime: 执行测试用例 Runtime-->>Env: 测试结果返回 Env-->>User: 测试结果输出 User->>Env: 构建运行时镜像 Env->>Runtime: 执行镜像构建 Runtime->>Runtime: 打包可执行文件 Runtime->>Runtime: 配置运行时环境 Runtime->>Runtime: 生成镜像 Runtime-->>Env: 镜像构建完成 Env-->>User: 镜像构建结果返回

3.5. 容器管理流程

sequenceDiagram participant User as 开发者 participant Host as 主机系统 participant Docker as Docker引擎 participant Env as 容器环境 User->>Host: 执行容器管理命令 Host->>Docker: 解析命令参数 alt 启动容器 Docker->>Env: 启动容器 Env->>Env: 初始化环境 Env-->>Docker: 容器启动完成 else 停止容器 Docker->>Env: 停止容器 Env->>Env: 保存状态 Env-->>Docker: 容器停止完成 else 重启容器 Docker->>Env: 重启容器 Env->>Env: 保存状态 Env->>Env: 重新初始化 Env-->>Docker: 容器重启完成 else 删除容器 Docker->>Env: 删除容器 Env->>Env: 清理资源 Env-->>Docker: 容器删除完成 end Docker-->>Host: 命令执行结果 Host-->>User: 结果返回

4. 详细UML类图

Apollo Docker子模块的UML类图展示了系统的核心组件、它们之间的关系以及各自的职责。类图设计遵循面向对象的设计原则,确保了系统的模块化、可扩展性和可维护性。

4.1. 核心模块类图

核心模块类图展示了Docker子模块的主要组件及其之间的关系,包括DockerSystem、BuildManager、ContainerManager等核心类。这些类构成了Docker子模块的骨架,负责系统的整体协调和管理。

classDiagram class DockerSystem { +initialize() +buildImages() +startContainer() +stopContainer() +cleanupResources() +getSystemStatus(): SystemStatus +setLogger(Logger): void -buildManager: BuildManager -containerManager: ContainerManager -config: DockerConfig -logger: Logger -systemStatus: SystemStatus } class BuildManager { +buildBaseImage() +buildCyberImage() +buildDevImage() +buildRuntimeImage() +buildTestImage() +buildProductionImage() +validateBuildConfig(): bool +getBuildProgress(): float +setBuildConfig(BuildConfig): void -dockerfiles: map -installers: list -buildConfig: BuildConfig -buildProgress: float -buildStatus: BuildStatus } class ContainerManager { +startDevContainer() +startRuntimeContainer() +startTestContainer() +enterContainer() +stopAllContainers() +removeContainer(string): bool +getContainerStatus(string): ContainerStatus +listContainers(): list -containers: list -containerConfig: ContainerConfig -containerFactory: ContainerFactory } class Dockerfile { +load(string) +getStages(): list +getPlatform(): string +generateBuildCommand(): string +getBuildArgs(): map +setBuildArg(string, string): void -content: string -stages: list -platform: string -gpuType: string -buildArgs: map -baseImage: string } class Stage { +getName(): string +getCommands(): list +getBaseStage(): string +addCommand(string): void -name: string -commands: list -baseStage: string -workdir: string -envVars: map } class Installer { <> +install() +uninstall() +getVersion(): string +getDependencies(): list +isInstalled(): bool +update(): bool -packageName: string -version: string -installPath: string -isInstalled: bool } class BazelInstaller { +installBazel() +configureBazel() +installBazelExtensions() +getBazelConfig(): BazelConfig -bazelVersion: string -extensions: list -bazelConfig: BazelConfig } class CUDAInstaller { +installCUDA() +installCUDNN() +installTensorRT() +configureCUDA() +validateCUDA(): bool -cudaVersion: string -cudnnVersion: string -tensorrtVersion: string -cudaConfig: CUDAConfig } class PythonInstaller { +installPython() +installPackages() +installVirtualEnv() +getPackageList(): list +createVirtualEnv(string): bool -pythonVersion: string -requirementsFile: string -packages: list -virtualEnvs: map } class ProtobufInstaller { +installProtobuf() +compileProtobufFiles(string): bool +getProtobufVersion(): string -protobufVersion: string -installPath: string -compilerPath: string } class Container { +start() +stop() +pause() +resume() +exec(string) +getLogs(): string +getResourceUsage(): ResourceUsage +getId(): string +getName(): string -containerId: string -containerName: string -image: string -status: ContainerStatus -ports: list -volumes: list -envVars: map -network: NetworkConfig } class ContainerFactory { +createDevContainer(): Container +createRuntimeContainer(): Container +createTestContainer(): Container +createProductionContainer(): Container -containerConfig: ContainerConfig } class SystemStatus { +isHealthy(): bool +getDockerVersion(): string +getAvailableSpace(): long +getCPUCount(): int -isHealthy: bool -dockerVersion: string -availableSpace: long -cpuCount: int -memorySize: long } DockerSystem --> BuildManager DockerSystem --> ContainerManager DockerSystem --> DockerConfig DockerSystem --> Logger DockerSystem --> SystemStatus BuildManager --> Dockerfile BuildManager --> Installer BuildManager --> BuildConfig BuildManager --> BuildStatus Dockerfile --> Stage Installer <|-- BazelInstaller Installer <|-- CUDAInstaller Installer <|-- PythonInstaller Installer <|-- ProtobufInstaller BazelInstaller --> BazelConfig CUDAInstaller --> CUDAConfig ContainerManager --> Container ContainerManager --> ContainerFactory ContainerManager --> ContainerConfig Container --> ResourceUsage Container --> PortMapping Container --> VolumeMapping Container --> NetworkConfig

4.2. 数据流类图

数据流类图展示了Docker子模块中数据的流动和处理过程,包括BuildData、ContainerData、ConfigData等核心数据类。这些类负责数据的传输、转换和存储,确保了系统数据的一致性和可靠性。

classDiagram class DockerData { <> +getTimestamp(): timestamp +getDataId(): string +serialize(): bytes +deserialize(bytes) +validate(): bool +clone(): DockerData #timestamp: timestamp #dataId: string #source: string #valid: bool } class BuildData { +getBuildType(): string +getPlatform(): string +getGPUType(): string +getStages(): list +getOptions(): map +getBuildProgress(): float +setBuildProgress(float): void +addBuildStage(string): void -buildType: string -platform: string -gpuType: string -stages: list -options: map -progress: float -buildId: string -startTime: timestamp -endTime: timestamp } class ContainerData { +getContainerId(): string +getImageName(): string +getStatus(): string +getStartTime(): timestamp +getEndTime(): timestamp +getResourceUsage(): ResourceUsage +setResourceUsage(ResourceUsage): void +setContainerStatus(string): void -containerId: string -imageName: string -status: string -startTime: timestamp -endTime: timestamp -resourceUsage: ResourceUsage -containerName: string -networkInfo: NetworkInfo } class ResourceUsage { +getCPU(): float +getMemory(): float +getGPU(): float +getDisk(): float +getNetworkIn(): long +getNetworkOut(): long +setCPU(float): void +setMemory(float): void +setGPU(float): void -cpuUsage: float -memoryUsage: float -gpuUsage: float -diskUsage: float -networkIn: long -networkOut: long -timestamp: timestamp } class ConfigData { +getConfigKey(): string +getConfigValue(): string +getScope(): string +isMandatory(): bool +getDefaultValue(): string +setConfigValue(string): void -configKey: string -configValue: string -scope: string -isMandatory: bool -defaultValue: string -description: string -dataType: string } class NetworkInfo { +getIPAddress(): string +getMacAddress(): string +getGateway(): string +getSubnetMask(): string +getPorts(): list -ipAddress: string -macAddress: string -gateway: string -subnetMask: string -ports: list } class LogData { +getLogLevel(): string +getLogMessage(): string +getLogSource(): string +getLogTimestamp(): timestamp +setLogLevel(string): void +setLogMessage(string): void -logLevel: string -logMessage: string -logSource: string -logTimestamp: timestamp -logId: string } DockerData <|-- BuildData DockerData <|-- ContainerData DockerData <|-- ConfigData DockerData <|-- LogData ContainerData --> ResourceUsage ContainerData --> NetworkInfo BuildData --> ConfigData ContainerData --> ConfigData LogData --> DockerData NetworkInfo --> PortMapping

4.3. 配置管理类图

配置管理类图展示了Docker子模块的配置管理系统,包括DockerConfig、PlatformConfig、GlobalConfig等核心配置类。这些类负责系统配置的加载、存储和管理,确保了系统配置的一致性和可维护性。

classDiagram class DockerConfig { +loadConfig(string): bool +saveConfig(string): bool +getPlatformConfig(string): PlatformConfig +setPlatformConfig(string, PlatformConfig): bool +getGlobalConfig(): GlobalConfig +setGlobalConfig(GlobalConfig): bool +getInstallerConfig(string): InstallerConfig +setInstallerConfig(string, InstallerConfig): bool +reloadConfig(): bool -platforms: map -globalConfig: GlobalConfig -installerConfigs: map -logger: Logger -configPath: string } class PlatformConfig { +getArchitecture(): string +getGPUType(): string +getOSVersion(): string +getDockerfilePath(): string +isValid(): bool +getSupportedStages(): list +addSupportedStage(string): void -architecture: string -gpuType: string -osVersion: string -dockerfilePath: string -supportedStages: list -baseImage: string -buildArgs: map } class GlobalConfig { +getDockerVersion(): string +getDefaultPlatform(): string +isGPUSupported(): bool +getNetworkMode(): string +getDefaultVolume(): string +isExperimentalFeaturesEnabled(): bool +setDefaultPlatform(string): void +setGPUSupported(bool): void -dockerVersion: string -defaultPlatform: string -gpuSupported: bool -networkMode: string -defaultVolume: string -experimentalFeatures: bool -defaultStage: string -cacheEnabled: bool } class InstallerConfig { +getInstallerName(): string +getVersion(): string +getDependencies(): list +getInstallPath(): string +getOptions(): map +setOption(string, string): void -installerName: string -version: string -dependencies: list -installPath: string -options: map -checksum: string -downloadURL: string } class ContainerConfig { +getContainerName(): string +getImageName(): string +getWorkdir(): string +getPortMappings(): list +getVolumeMappings(): list +getEnvVars(): map +addPortMapping(PortMapping): void +addVolumeMapping(VolumeMapping): void +setEnvVar(string, string): void -containerName: string -imageName: string -workdir: string -portMappings: list -volumeMappings: list -envVars: map -privileged: bool -networkMode: string } class PortMapping { +getHostPort(): int +getContainerPort(): int +getProtocol(): string -hostPort: int -containerPort: int -protocol: string } class VolumeMapping { +getHostPath(): string +getContainerPath(): string +getMode(): string -hostPath: string -containerPath: string -mode: string } class NetworkConfig { +getNetworkName(): string +getNetworkMode(): string +getIPAddress(): string +isBridgeMode(): bool -networkName: string -networkMode: string -ipAddress: string -subnet: string -gateway: string } DockerConfig --> PlatformConfig DockerConfig --> GlobalConfig DockerConfig --> InstallerConfig DockerConfig --> Logger PlatformConfig --> InstallerConfig GlobalConfig --> InstallerConfig ContainerManager --> ContainerConfig ContainerConfig --> PortMapping ContainerConfig --> VolumeMapping ContainerConfig --> NetworkConfig Container --> NetworkConfig

5. 状态机

Apollo Docker子模块的状态机展示了系统在不同阶段的状态转换和处理流程,包括镜像构建状态机和容器生命周期状态机等。这些状态机设计清晰,状态转换明确,便于开发者理解系统的运行机制和行为。

5.1. Docker镜像构建状态机

Docker镜像构建状态机展示了从构建开始到构建完成的完整流程,包括初始化、验证、配置、构建、测试等多个阶段。每个阶段都有明确的状态转换条件和处理逻辑,确保了构建过程的稳定性和可靠性。

stateDiagram-v2 [*] --> Initializing: 开始构建流程 Initializing --> Validating: 初始化完成 Validating --> Configuring: 验证通过 Configuring --> Building: 配置完成 Building --> Testing: 构建完成 Testing --> Publishing: 测试通过 Publishing --> [*]: 发布完成 Validating --> Error: 验证失败 Configuring --> Error: 配置失败 Building --> Error: 构建失败 Testing --> Error: 测试失败 Publishing --> Error: 发布失败 Error --> [*]: 结束构建 state Initializing { [*] --> LoadingDockerfile: 加载Dockerfile LoadingDockerfile --> ParsingStages: Dockerfile加载完成 ParsingStages --> LoadingInstallers: 阶段解析完成 LoadingInstallers --> ValidatingDockerfile: 安装脚本加载完成 ValidatingDockerfile --> [*]: Dockerfile验证通过 } state Validating { [*] --> CheckingDockerVersion: 检查Docker版本 CheckingDockerVersion --> CheckingPlatform: Docker版本检查通过 CheckingPlatform --> CheckingGPU: 平台检查通过 CheckingGPU --> CheckingDependencies: GPU检查通过 CheckingDependencies --> ValidatingBuildArgs: 依赖检查通过 ValidatingBuildArgs --> [*]: 构建参数验证通过 } state Configuring { [*] --> SettingEnvironment: 设置环境变量 SettingEnvironment --> ConfiguringBuildArgs: 环境变量设置完成 ConfiguringBuildArgs --> SettingCache: 构建参数配置完成 SettingCache --> ConfiguringNetwork: 缓存策略设置完成 ConfiguringNetwork --> [*]: 网络配置完成 } state Building { [*] --> BuildingBase: 构建基础镜像 BuildingBase --> BuildingCyber: 基础镜像构建完成 BuildingCyber --> BuildingDev: Cyber镜像构建完成 BuildingDev --> BuildingRuntime: 开发镜像构建完成 BuildingRuntime --> BuildingTest: 运行时镜像构建完成 BuildingTest --> BuildingProduction: 测试镜像构建完成 BuildingProduction --> [*]: 生产镜像构建完成 } state Testing { [*] --> TestingBase: 测试基础镜像 TestingBase --> TestingCyber: 基础镜像测试通过 TestingCyber --> TestingDev: Cyber镜像测试通过 TestingDev --> TestingRuntime: 开发镜像测试通过 TestingRuntime --> TestingTest: 运行时镜像测试通过 TestingTest --> TestingProduction: 测试镜像测试通过 TestingProduction --> [*]: 生产镜像测试通过 } state Publishing { [*] --> TaggingImage: 标记镜像 TaggingImage --> PushingImage: 镜像标记完成 PushingImage --> VerifyingImage: 镜像推送完成 VerifyingImage --> [*]: 镜像验证完成 } state Error { [*] --> LoggingError: 记录错误信息 LoggingError --> CleaningUp: 错误信息记录完成 CleaningUp --> [*]: 资源清理完成 }

5.2. Docker容器生命周期状态机

Docker容器生命周期状态机展示了容器从创建到删除的完整生命周期,包括创建、运行、暂停、停止、重启、删除等多个状态。每个状态都有明确的转换条件和处理逻辑,确保了容器管理的稳定性和可靠性。

stateDiagram-v2 [*] --> Created: 创建容器 Created --> Running: 启动容器 Running --> Paused: 暂停容器 Paused --> Running: 恢复容器 Running --> Stopped: 停止容器 Stopped --> Running: 重启容器 Stopped --> Removed: 删除容器 Removed --> [*]: 容器删除完成 state Created { [*] --> ConfiguringContainer: 配置容器参数 ConfiguringContainer --> MountingVolumes: 容器参数配置完成 MountingVolumes --> MappingPorts: 卷挂载完成 MappingPorts --> SettingEnvVars: 端口映射完成 SettingEnvVars --> [*]: 环境变量设置完成 } state Running { [*] --> Initializing: 初始化容器 Initializing --> Ready: 初始化完成 Ready --> Processing: 执行命令 Processing --> Ready: 命令执行完成 Ready --> Monitoring: 监控容器状态 Monitoring --> Ready: 状态检查完成 Ready --> [*]: 退出容器 } state Paused { [*] --> SavingMemory: 保存内存状态 SavingMemory --> [*]: 内存状态保存完成 } state Stopped { [*] --> SavingState: 保存容器状态 SavingState --> ClosingNetwork: 状态保存完成 ClosingNetwork --> ReleasingResources: 网络连接关闭 ReleasingResources --> [*]: 资源释放完成 } state Removed { [*] --> RemovingContainer: 删除容器 RemovingContainer --> UnmountingVolumes: 容器删除完成 UnmountingVolumes --> CleaningUp: 卷卸载完成 CleaningUp --> [*]: 清理完成 }

5.3. Docker环境配置状态机

Docker环境配置状态机展示了环境配置的完整流程,包括初始化、检查、配置、验证等多个阶段。每个阶段都有明确的状态转换条件和处理逻辑,确保了环境配置的正确性和一致性。

stateDiagram-v2 [*] --> Initializing: 开始环境配置 Initializing --> Checking: 初始化完成 Checking --> Configuring: 检查通过 Configuring --> Validating: 配置完成 Validating --> Ready: 验证通过 Ready --> [*]: 环境配置完成 Checking --> Error: 检查失败 Configuring --> Error: 配置失败 Validating --> Error: 验证失败 Error --> [*]: 环境配置结束 state Initializing { [*] --> LoadingConfig: 加载配置文件 LoadingConfig --> ParsingConfig: 配置文件加载完成 ParsingConfig --> [*]: 配置文件解析完成 } state Checking { [*] --> CheckingSystem: 检查系统环境 CheckingSystem --> CheckingDocker: 系统环境检查通过 CheckingDocker --> CheckingDependencies: Docker检查通过 CheckingDependencies --> [*]: 依赖检查通过 } state Configuring { [*] --> ConfiguringNetwork: 配置网络 ConfiguringNetwork --> ConfiguringStorage: 网络配置完成 ConfiguringStorage --> ConfiguringPermissions: 存储配置完成 ConfiguringPermissions --> [*]: 权限配置完成 } state Validating { [*] --> TestingNetwork: 测试网络连接 TestingNetwork --> TestingStorage: 网络连接测试通过 TestingStorage --> TestingPermissions: 存储测试通过 TestingPermissions --> [*]: 权限测试通过 } state Ready { [*] --> InitializingEnvironment: 初始化环境 InitializingEnvironment --> [*]: 环境初始化完成 }

5.4. Docker镜像缓存状态机

Docker镜像缓存状态机展示了镜像缓存的管理流程,包括检查缓存、使用缓存、更新缓存等多个阶段。每个阶段都有明确的状态转换条件和处理逻辑,确保了缓存的有效性和一致性。

stateDiagram-v2 [*] --> CheckingCache: 检查缓存 CheckingCache --> UsingCache: 缓存存在且有效 CheckingCache --> BuildingFromScratch: 缓存不存在或无效 UsingCache --> UpdatingCache: 使用缓存完成 BuildingFromScratch --> UpdatingCache: 重新构建完成 UpdatingCache --> [*]: 缓存更新完成 state CheckingCache { [*] --> CheckingCacheExistence: 检查缓存是否存在 CheckingCacheExistence --> CheckingCacheValidity: 缓存存在 CheckingCacheValidity --> [*]: 缓存有效 } state UsingCache { [*] --> LoadingCachedLayers: 加载缓存层 LoadingCachedLayers --> VerifyingCachedLayers: 缓存层加载完成 VerifyingCachedLayers --> [*]: 缓存层验证通过 } state BuildingFromScratch { [*] --> BuildingNewLayers: 构建新层 BuildingNewLayers --> VerifyingNewLayers: 新层构建完成 VerifyingNewLayers --> [*]: 新层验证通过 } state UpdatingCache { [*] --> SavingNewLayers: 保存新层 SavingNewLayers --> UpdatingCacheMetadata: 新层保存完成 UpdatingCacheMetadata --> [*]: 缓存元数据更新完成 }

6. 源码分析

6.1. 构建系统核心代码分析

6.1.1. build_docker.sh 脚本核心逻辑
bash 复制代码
#!/usr/bin/env bash

# 支持的架构和GPU类型定义
SUPPORTED_ARCHS=(x86_64 aarch64)
SUPPORTED_GPUS=(amd nvidia)
SUPPORTED_STAGES=(base cyber dev runtime)

# 配置参数初始化
TARGET_ARCH=""
TARGET_GPU=""
TARGET_STAGE=""
USE_CACHE=1

# 核心功能函数
gpu_support_check() {
    local gpu="$1"
    for entry in "${SUPPORTED_GPUS[@]}"; do
        if [[ "${entry}" == "${gpu}" ]]; then
            return
        fi
    done
    echo "Unsupported GPU: ${gpu}. Exiting..."
    exit 1
}

# 构建命令生成函数
generate_build_command() {
    local build_cmd="docker build"
    
    if [[ ${USE_CACHE} -eq 0 ]]; then
        build_cmd+=" --no-cache"
    fi
    
    build_cmd+=" --build-arg CUDA_LITE=${CUDA_LITE}"
    build_cmd+=" --build-arg CUDNN_VERSION=${CUDNN_VERSION}"
    build_cmd+=" --build-arg TENSORRT_VERSION=${TENSORRT_VERSION}"
    
    build_cmd+=" -t ${IMAGE_OUT}"
    build_cmd+=" -f ${DOCKERFILE} ."
    
    echo "${build_cmd}"
}

# 主流程
determine_target_arch_and_stage "${DOCKERFILE}"
validate_build_config
configure_build_environment
generate_build_command
exec_build_command
6.1.2. Dockerfile 结构分析
dockerfile 复制代码
FROM nvidia/cuda:11.1-cudnn8-devel-ubuntu18.04 AS base

# 系统环境配置
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential \
    git \
    curl \
    wget \
    && rm -rf /var/lib/apt/lists/*

# 安装脚本复制和执行
COPY installers/install_base.sh /apollo/installers/
RUN chmod +x /apollo/installers/install_base.sh
RUN /apollo/installers/install_base.sh

# 环境变量配置
ENV APOLLO_HOME=/apollo
ENV PATH=${APOLLO_HOME}/bin:${PATH}
ENV LD_LIBRARY_PATH=${APOLLO_HOME}/lib:${LD_LIBRARY_PATH}

# 工作目录设置
WORKDIR ${APOLLO_HOME}

6.2. 容器管理核心代码分析

6.2.1. dev_start.sh 脚本核心逻辑
bash 复制代码
#!/usr/bin/env bash

# 容器配置参数
CONTAINER_NAME="apollo_dev"
IMAGE_NAME="apolloauto/apollo:dev-x86_64-nvidia"
WORKDIR="${PWD}"
PORT_MAPPINGS="-p 8888:8888 -p 5555:5555"

# 检查Docker是否运行
if ! docker info > /dev/null 2>&1; then
    echo "Docker is not running. Please start Docker first."
    exit 1
fi

# 检查容器是否已存在
if docker ps -a | grep -q "${CONTAINER_NAME}"; then
    echo "Container ${CONTAINER_NAME} already exists. Starting it..."
    docker start "${CONTAINER_NAME}"
else
    echo "Creating new container ${CONTAINER_NAME}..."
    docker run -itd \
        --name "${CONTAINER_NAME}" \
        --privileged \
        --net host \
        --ipc host \
        --pid host \
        ${PORT_MAPPINGS} \
        -v "${WORKDIR}:/apollo" \
        -v /tmp/.X11-unix:/tmp/.X11-unix \
        -e DISPLAY=${DISPLAY} \
        "${IMAGE_NAME}"
fi

# 进入容器
echo "Entering container ${CONTAINER_NAME}..."
docker exec -it "${CONTAINER_NAME}" /bin/bash
6.2.2. dev_into.sh 脚本核心逻辑
bash 复制代码
#!/usr/bin/env bash

# 查找Apollo开发容器
CONTAINER_ID=$(docker ps | grep apolloauto/apollo:dev | awk '{print $1}')

if [ -z "${CONTAINER_ID}" ]; then
    echo "No running Apollo development container found."
    echo "Please run 'bash scripts/dev_start.sh' first."
    exit 1
fi

# 进入容器
echo "Entering Apollo development container: ${CONTAINER_ID}"
docker exec -it "${CONTAINER_ID}" /bin/bash

6.3. 安装系统核心代码分析

6.3.1. installer_base.sh 脚本核心逻辑
bash 复制代码
#!/usr/bin/env bash

# 基础安装类
installer_base() {
    local package_name="$1"
    local version="$2"
    local install_path="$3"
    
    echo "Installing ${package_name} version ${version}..."
    
    # 检查是否已安装
    if is_installed "${package_name}"; then
        echo "${package_name} is already installed."
        return 0
    fi
    
    # 下载源码或二进制包
    download_package "${package_name}" "${version}"
    
    # 安装包
    install_package "${package_name}" "${version}" "${install_path}"
    
    # 验证安装
    if verify_install "${package_name}"; then
        echo "${package_name} installed successfully."
        return 0
    else
        echo "Failed to install ${package_name}."
        return 1
    fi
}

# 安装验证函数
verify_install() {
    local package_name="$1"
    echo "Verifying ${package_name} installation..."
    # 验证逻辑
    return 0
}
6.3.2. install_bazel.sh 脚本核心逻辑
bash 复制代码
#!/usr/bin/env bash

# Bazel安装函数
install_bazel() {
    local bazel_version="4.2.2"
    local install_path="/usr/local/bin"
    
    echo "Installing Bazel version ${bazel_version}..."
    
    # 下载Bazel安装器
    wget -O /tmp/bazel_installer.sh \
        "https://github.com/bazelbuild/bazel/releases/download/${bazel_version}/bazel-${bazel_version}-installer-linux-x86_64.sh"
    
    # 安装Bazel
    chmod +x /tmp/bazel_installer.sh
    /tmp/bazel_installer.sh --prefix="${install_path}"
    
    # 配置环境变量
    echo "export PATH=${install_path}:\${PATH}" >> /etc/profile
    
    # 验证安装
    if bazel --version > /dev/null 2>&1; then
        echo "Bazel ${bazel_version} installed successfully."
        return 0
    else
        echo "Failed to install Bazel."
        return 1
    fi
}

6.4. 配置管理核心代码分析

6.4.1. setup.sh 脚本核心逻辑
bash 复制代码
#!/usr/bin/env bash

# Apollo环境配置脚本
export APOLLO_ROOT_DIR="/apollo"
export CYBER_PATH="${APOLLO_ROOT_DIR}/cyber"
export LD_LIBRARY_PATH="${CYBER_PATH}/lib:${LD_LIBRARY_PATH}"
export PATH="${CYBER_PATH}/bin:${APOLLO_ROOT_DIR}/bin:${PATH}"

# Bazel配置
export BAZEL_CONFIG="--config=cuda"
export BAZEL_OUTPUT_BASE="${APOLLO_ROOT_DIR}/.cache/bazel"

# 工作目录设置
cd "${APOLLO_ROOT_DIR}" || exit

# 环境变量验证
echo "Apollo environment configured successfully."
echo "APOLLO_ROOT_DIR: ${APOLLO_ROOT_DIR}"
echo "CYBER_PATH: ${CYBER_PATH}"
echo "PATH: ${PATH}"

7. 设计模式

7.1. 构建器模式

Apollo Docker子模块采用构建器模式来构建不同类型的Docker镜像。通过将复杂的构建过程分解为多个简单的步骤,提高了代码的可维护性和扩展性。

bash 复制代码
# 构建器模式的实现
build_base_image() {
    # 构建基础镜像的步骤
    configure_base_environment
    install_base_dependencies
    setup_base_configuration
}

build_cyber_image() {
    # 构建Cyber镜像的步骤
    build_base_image  # 继承基础镜像
    install_cyber_dependencies
    build_cyber_framework
    setup_cyber_configuration
}

build_dev_image() {
    # 构建开发镜像的步骤
    build_cyber_image  # 继承Cyber镜像
    install_dev_dependencies
    setup_dev_environment
    configure_dev_tools
}

7.2. 工厂方法模式

在Docker容器管理中,工厂方法模式用于创建不同类型的容器实例。

bash 复制代码
# 工厂方法模式的实现
create_dev_container() {
    # 创建开发容器
    create_container "dev" "${DEV_IMAGE}" "${DEV_CONTAINER_NAME}"
}

create_runtime_container() {
    # 创建运行时容器
    create_container "runtime" "${RUNTIME_IMAGE}" "${RUNTIME_CONTAINER_NAME}"
}

create_container() {
    local type="$1"
    local image="$2"
    local name="$3"
    
    # 根据类型创建不同的容器配置
    if [[ "${type}" == "dev" ]]; then
        docker run -itd --name "${name}" --privileged --net host -v "${WORKDIR}:/apollo" "${image}"
    elif [[ "${type}" == "runtime" ]]; then
        docker run -itd --name "${name}" --net host "${image}"
    fi
}

7.3. 策略模式

策略模式用于处理不同平台和GPU类型的构建策略。

bash 复制代码
# 策略模式的实现
set_build_strategy() {
    local arch="$1"
    local gpu="$2"
    
    if [[ "${arch}" == "x86_64" && "${gpu}" == "nvidia" ]]; then
        BUILD_STRATEGY="x86_64_nvidia_strategy"
    elif [[ "${arch}" == "x86_64" && "${gpu}" == "amd" ]]; then
        BUILD_STRATEGY="x86_64_amd_strategy"
    elif [[ "${arch}" == "aarch64" && "${gpu}" == "nvidia" ]]; then
        BUILD_STRATEGY="aarch64_nvidia_strategy"
    fi
}

# 不同策略的实现
x86_64_nvidia_strategy() {
    echo "Using x86_64 NVIDIA build strategy"
    DOCKERFILE="base.x86_64.nvidia.dockerfile"
    CUDA_LITE="11.1"
    CUDNN_VERSION="8.0.4.30"
    TENSORRT_VERSION="7.2.1"
}

7.4. 模板方法模式

模板方法模式用于定义安装流程的骨架,具体步骤由子类实现。

bash 复制代码
# 模板方法模式的实现
install_package() {
    local package="$1"
    
    # 安装流程的固定步骤
    pre_install "${package}"
    do_install "${package}"  # 具体安装步骤由子类实现
    post_install "${package}"
    verify_install "${package}"
}

# 具体安装实现
do_install() {
    local package="$1"
    
    if [[ "${package}" == "bazel" ]]; then
        # Bazel安装实现
        install_bazel
    elif [[ "${package}" == "protobuf" ]]; then
        # Protobuf安装实现
        install_protobuf
    fi
}

7.5. 单例模式

单例模式用于管理全局配置和资源。

bash 复制代码
# 单例模式的实现
_get_docker_config() {
    if [[ -z "${DOCKER_CONFIG_INSTANCE}" ]]; then
        DOCKER_CONFIG_INSTANCE="$(create_config_instance)"
    fi
    echo "${DOCKER_CONFIG_INSTANCE}"
}

create_config_instance() {
    # 创建配置实例
    local config=""
    config+="APOLLO_REPO=apolloauto/apollo"
    config+=";UBUNTU_LTS=18.04"
    config+=";CUDA_LITE=11.1"
    config+=";CUDNN_VERSION=8.0.4.30"
    echo "${config}"
}

8. 总结

Apollo Docker子模块通过容器化技术实现了开发环境的一致性和可移植性,采用分层架构设计支持多平台和多种硬件加速。该模块包含构建系统、开发环境、运行时环境和辅助工具四大核心组件,通过构建器、工厂方法、策略等多种设计模式提高了代码的可维护性和扩展性。Docker子模块为Apollo自动驾驶平台提供了高效、可靠的开发和运行环境,是平台生态系统的重要组成部分,为开发者提供了便捷的开发体验。

相关推荐
Coder个人博客2 小时前
05_apollo_tools子模块整体软件架构深入分析文档
架构
会飞的大可2 小时前
WMS系统演进——从单体到微服务
微服务·云原生·架构
源远流长jerry3 小时前
软件定义网络 SDN 核心技术深度解析:从概念到实践
linux·网络·架构
二等饼干~za8986683 小时前
豆包GEO优化源码开发全解析:技术架构、实现逻辑与实操指南
数据库·sql·重构·架构·mybatis·音视频
盘古信息IMS3 小时前
2026年注塑MES系统选型新思维:从技术架构到行业适配的全方位评估框架
大数据·架构
roman_日积跬步-终至千里3 小时前
【软件系统架构师-综合题(2)】项目管理题目
架构
ai生成式引擎优化技术3 小时前
TSPR-WEB-LLM-HIC 生产级架构升级方案
架构
heimeiyingwang4 小时前
【架构实战】灰度发布架构设计与实现
架构