Docker git push перед уничтожением контейнера - PullRequest
0 голосов
/ 21 марта 2019

Я докеризовал проект Node. Этот проект генерирует файлы.

Всякий раз, когда контейнер уничтожается, я теряю все сгенерированные файлы. Я думаю об использовании события «SIGTERM» и делаю git push, когда контейнер собирается быть уничтожен.

Есть ли другой подход, который можно использовать в этой ситуации?

Ответы [ 3 ]

2 голосов
/ 21 марта 2019

Вы можете использовать bind mounts (см. этот ответ ). Он позволяет получить доступ к вашей файловой системе хоста из контейнера, а это означает, что контейнер может хранить файлы в каталоге, доступном хосту, даже когда он выходит.

Для вашего случая это означает, что проект будет генерировать файлы в некоторой папке, используя путь к файлу, локальный для контейнера, в то время как вы по-прежнему будете видеть изменения извне, используя пути к вашей хост-системе.

1 голос
/ 21 марта 2019

В нашей инфраструктуре 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
1 голос
/ 21 марта 2019

Как я понимаю, вы хотите иметь возможность сохранять файлы внутри вашего контейнера до его уничтожения.У вас есть несколько возможностей:

  • смонтировать том в вашем контейнере - ваши данные будут по-прежнему доступны даже после уничтожения контейнера и могут быть смонтированы в новом контейнере или в резервном хранилище.где-то в другом месте
  • используйте связывающее монтирование , на что указывает ответ Юрия - ваши данные будут доступны на хост-машине после уничтожения контейнера
  • используйте docker cp перед уничтожением, чтобы сделать резервную копию ваших данных на хост-машине
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...