如何在基于AKS的VSTS代理中配置环境并运行Docker命令?
AKS上Azure DevOps自托管代理配置解决方案
我们已按照微软文档将自托管代理部署到Azure DevOps代理池,且可在代理上执行流水线,使用的Dockerfile如下:
FROM ubuntu:18.04 # To make it easier for build and release pipelines to run apt-get, # configure apt to not require confirmation (assume the -y argument by default) ENV DEBIAN_FRONTEND=noninteractive RUN echo "APT::Get::Assume-Yes \"true\";" > /etc/apt/apt.conf.d/90assumeyes RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ curl \ jq \ git \ iputils-ping \ libcurl4 \ libicu60 \ libunwind8 \ netcat \ libssl1.0 \ maven \ python \ python3 \ docker \ && rm -rf /var/lib/apt/lists/* RUN curl -LsS https://aka.ms/InstallAzureCLIDeb | bash \ && rm -rf /var/lib/apt/lists/* # Can be 'linux-x64', 'linux-arm64', 'linux-arm', 'rhel.6-x64'. ENV TARGETARCH=linux-x64 WORKDIR /azp COPY ./vstsagent/ . COPY ./start.sh . RUN chmod +x start.sh ENTRYPOINT ["./start.sh"]
针对以下两个疑问,提供具体解决方案:
1. 配置Maven、Java目录及各类自定义配置文件
Maven与Java环境配置
- 设置环境变量:Ubuntu 18.04安装Maven时会默认安装OpenJDK,若需指定Java版本,可先安装对应JDK,再在Dockerfile中添加环境变量:
# 安装指定版本OpenJDK(以11为例) RUN apt-get install -y openjdk-11-jdk ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 ENV PATH=$JAVA_HOME/bin:$PATH # 设置Maven环境变量 ENV MAVEN_HOME=/usr/share/maven ENV PATH=$MAVEN_HOME/bin:$PATH - 自定义Maven settings.xml:将本地的
settings.xml拷贝至容器内的Maven配置目录,在Dockerfile中添加:
若需全局生效,可拷贝至# 拷贝自定义settings.xml到用户目录下的.m2文件夹 COPY ./settings.xml /root/.m2/settings.xml/usr/share/maven/conf/settings.xml。
Node.js配置
- 安装Node.js:推荐使用nvm管理版本,在Dockerfile中添加:
# 安装nvm RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # 安装指定版本Node(以20为例) RUN export NVM_DIR="$HOME/.nvm" && [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" && nvm install 20 - 自定义npm配置:将本地的
.npmrc拷贝至容器用户根目录:COPY ./.npmrc /root/.npmrc
Gradle配置
- 安装Gradle:可通过下载二进制包安装指定版本,在Dockerfile中添加:
# 下载并解压Gradle(以8.5为例) RUN curl -L https://services.gradle.org/distributions/gradle-8.5-bin.zip -o gradle.zip && unzip gradle.zip -d /opt && rm gradle.zip ENV GRADLE_HOME=/opt/gradle-8.5 ENV PATH=$GRADLE_HOME/bin:$PATH - 自定义Gradle配置:将本地的
gradle.properties或init.gradle拷贝至容器用户的.gradle目录:COPY ./gradle.properties /root/.gradle/gradle.properties
2. 修复Docker安装并执行Docker流水线任务
问题原因
Ubuntu 18.04官方源中的docker包为旧版本的Docker.io,并非官方Docker引擎,导致安装后无法正常使用。
修复Docker安装
修改Dockerfile中的Docker安装步骤,替换为官方Docker引擎安装命令:
# 先安装Docker依赖工具 RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ curl \ jq \ git \ iputils-ping \ libcurl4 \ libicu60 \ libunwind8 \ netcat \ libssl1.0 \ maven \ python \ python3 \ gnupg \ lsb-release \ && rm -rf /var/lib/apt/lists/* # 添加Docker官方GPG密钥与源 RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg RUN echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装Docker引擎、CLI与containerd RUN apt-get update && apt-get install -y docker-ce docker-ce-cli containerd.io \ && rm -rf /var/lib/apt/lists/*
执行Docker流水线任务
在AKS中运行Docker任务,推荐挂载宿主机的Docker Socket(无需特权模式,性能更优):
- 在代理的Deployment YAML中添加Volume与挂载配置:
volumes: - name: docker-socket hostPath: path: /var/run/docker.sock containers: - name: azp-agent volumeMounts: - name: docker-socket mountPath: /var/run/docker.sock - 重新部署代理后,即可在流水线中使用Docker任务执行镜像构建、推送等操作。
内容的提问来源于stack exchange,提问作者Vowneee
相关产品推荐
相关产品推荐

