В нашей инфраструктуре CI мы используем Jenkins и Docker.Дженкинс запускает контейнер Docker, а затем запускает команду в контейнере для создания некоторого программного обеспечения.Когда сборка программного обеспечения завершена, скрипт сборки внутри контейнера выдает команду, которая фиксирует и архивирует контейнер как образ в реестр Docker.Изображение содержит все временные файлы и конфигурацию инструмента.Это позволяет нам позже воссоздать контейнер из заархивированного изображения и повторно запустить тесты со всеми зависимостями и уже созданными файлами.
Следующий скрипт можно запустить изнутри контейнера:
#!/usr/bin/env bash
set -ex
# The docker registry should be located at a hostname:port address. (see push ref link below)
REGISTRY=TESTRACK:5000
TAG=${2}
CONTAINER_NAME=${1}
function get-container-id() {
# When executed from within a docker container, the kernel cgroup file contains a control group for docker processes
# The container id of the current container (from within that container) can be fetched this way.
cat /proc/self/cgroup | grep "cpuset:/docker" | sed 's/\([0-9]\+\):cpuset:\/docker\///g'
# Below, using head, is less reliable; the docker line is not always the first line in the cgroup
# head -1 /proc/self/cgroup | cut -d/ -f3
}
CONTAINER_ID=$(get-container-id)
if [ -z ${CONTAINER_ID} ]; then
echo "Error. Did not find a docker container value!"
exit 1
fi
# https://docs.docker.com/engine/reference/commandline/commit/#examples
docker commit ${CONTAINER_ID} ${REGISTRY}/${CONTAINER_NAME}:$TAG
docker tag ${REGISTRY}/${CONTAINER_NAME}:$TAG ${REGISTRY}/${CONTAINER_NAME}:latest
#remove existing images without tags
OLD=`docker images -f "reference=TESTRACK-1:5000/$CONTAINER_NAME" -f "dangling=true" -q`
if [ -n "${OLD}" ]; then
docker rmi -f ${OLD} || true
fi
# https://docs.docker.com/engine/reference/commandline/push/
#do not show push progress
docker push ${REGISTRY}/${CONTAINER_NAME}:$TAG &> push_result_tag.txt
docker push ${REGISTRY}/${CONTAINER_NAME}:latest &> push_result.txt
Обратите внимание, что этот скрипт можно запускать только внутри контейнера, если этот контейнер имеет доступ к демону Docker.Поэтому вам следует запустить контейнер с доступом к сокету демона Docker
-v /var/run/docker.sock:/var/run/docker.sock