Dockerized Teamcity агентам, скорее всего, потребуется расширить базовый образ c и использовать соответствующие пакеты управления.
Например, мы используем teamcity-minimal-agent
образ на основе ОС Ubuntu.
Ниже приведен пример расширенного Dockerfile
, который содержит инструкции по установке некоторых базовых c инструментов и дополнительных пакетов, необходимых нашему программному обеспечению, а также docker клиента для запуска "docker в docker" .
Кроме того, он выполняет шаги для синхронизации c идентификатора пользователя ОС и buildagent
идентификатора пользователя, используемого для запуска агента.
# Custom Dockerfile
FROM jetbrains/teamcity-minimal-agent:2019.2
ARG user_id
ARG docker_group_id
ENV USER_ID=${user_id}
# Set correct environment variables.
ENV LANG C.UTF-8
ENV DEBIAN_FRONTEND noninteractive
# Install basic tools
RUN apt-get update && \
apt-get -y --no-install-recommends install \
dirmngr \
gpg-agent \
software-properties-common \
apt-transport-https \
wget \
zip \
git
# Add key and docker repository
ENV DOCKER_VERSION 18.03.1~ce~3-0~ubuntu
RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
RUN echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
# Install necessary software
RUN apt-get update
RUN apt-get -y --no-install-recommends install \
docker-ce=${DOCKER_VERSION} \
rsync openssh-client vim python python-dev \
bzip2 nodejs dnsutils sudo
# Install pip and packages
RUN curl -sS 'https://bootstrap.pypa.io/get-pip.py' | python
RUN pip install \
pep8 \
requests
# Access and signature for github repositories
COPY <my-gpg-file>.gpg /var/tmp/<my-gpg-file>.gpg
# Pass OS user's id and export it to use in subcontainers
RUN groupmod -g ${USER_ID} buildagent && \
usermod -g ${USER_ID} -G docker buildagent
# Sync docker group id between OS and container
RUN groupmod -g ${docker_group_id} docker
USER buildagent
RUN gpg --allow-secret-key-import --import /var/tmp/<my-gpg-file>.gpg
RUN git config --global user.email "admin@example.com" && \
git config --global user.name "Teamcity Bot" && \
git config --global user.signingkey <my-gpg-key>
USER root
Docker -составить намного легче бежать. Найдите пример ниже. Он позволяет запускать контейнер docker в агентском docker контейнере, известном как "docker in docker".
# Docker-compose to run containers
#
# Build images: DOCKER_GROUP_ID=$(getent group docker | cut -d: -f3) USER_ID=$(id -u) docker-compose build
# Start containers: docker-compose up -d
#
version: '2.2'
services:
teamcity-server:
hostname: "teamcity-server"
container_name: "teamcity-server"
build: "."
volumes:
- "/data/teamcity:/data/teamcity:rw"
environment:
TEAMCITY_SERVER_MEM_OPTS: -Xmx1g -XX:ReservedCodeCacheSize=350m
TEAMCITY_LOGS: /opt/teamcity/logs
TEAMCITY_DIST: /opt/teamcity
TEAMCITY_DATA_PATH: /opt/teamcity/data
ports:
- "443:443"
- "80:80"
restart: "always"
teamcity-agent:
hostname: "teamcity-agent-01"
container_name: "teamcity-agent-01"
build:
context: "./teamcity-agent"
args:
user_id: "${USER_ID}"
docker_group_id: "${DOCKER_GROUP_ID}"
image: "teamcity-agent"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "/var/lib/docker:/var/lib/docker"
- "/opt/share/.composer:/home/buildagent/.composer:rw"
- "/opt/agents:/opt/agents:rw"
environment:
- "SERVER_URL=https://<teamcity-url>"
- "AWS_DEFAULT_REGION=ap-southeast-1"
- "AGENT_NAME=teamcity-agent-01"
- "RUN_AS_BUILDAGENT=true"
privileged: true
restart: "always"
cpus: 1
mem_limit: 1g
Эти примеры также могут быть значительно упрощены.