Как я всегда могу вытащить мое последнее docker изображение, но все же детерминистически записать его композицию для будущей воспроизводимости? - PullRequest
0 голосов
/ 01 мая 2020

Я занимаюсь аналитической работой в «Лабораторной» docker среде, которой управляю Я использую Travis, чтобы создать, пометить и опубликовать sh лабораторный образ в реестре контейнера docker (AWS ECR), а затем всегда извлекаю изображение latest, когда запускаю контейнер, чтобы выполнить свою аналитическую работу. Это гарантирует, что я всегда работаю в последней версии лабораторной среды. Примечание: каждый раз, когда Трэвис публикует новое изображение, он помечает его в ECR со строками git идентификатор фиксации и latest.

. Для воспроизводимости моих аналитических результатов я хотел бы Мой код python, работающий внутри контейнера, чтобы иметь возможность записывать на свои выходные данные идентификатор, указывающий точное используемое изображение docker. Это позволило бы мне повторно загрузить этот конкретный образ docker спустя много месяцев / лет из ECR и / или найти коммит git, из которого был создан образ docker, снова запустить код и (надеюсь!) получить те же результаты.

Какой самый стандартный способ достижения этого? Могу ли я сохранить дайджест изображения как переменную среды внутри контейнера?

Ответы [ 3 ]

2 голосов
/ 01 мая 2020

Возможно, есть несколько вариантов, но это зависит от того, как строится изображение.

Предполагается, что исходный код клонирован в CI, а из этого источника построено изображение (так что вы не клонируете исходный код в Dockerfile), вы можете использовать build-arg для «выпекания», которые фиксируются в образе в качестве переменной среды;

В вашем Dockerfile определите build-arg (ARG) и присвойте его значение переменной среды (ENV). Необходимо присвоить его ENV, потому что аргументы сборки (по проекту) не сохраняются в самом образе (доступно только во время сборки).

Например:

FROM busybox:latest
ARG GIT_COMMIT=HEAD
ENV GIT_COMMIT=${GIT_COMMIT}

Я устанавливаю значение по умолчанию, чтобы переменная содержала нечто «полезное», если Dockerfile собран без передачи build-arg

Затем при построении изображения передайте коммит git как build arg

git clone https://github.com/me/my-repo.git && cd my-repo

export GIT_COMMIT=$(git rev-parse --short --verify HEAD)

docker build -t lab:${GIT_COMMIT} --build-arg GIT_COMMIT=${GIT_COMMIT} .

При запуске образа в качестве переменной среды доступен GIT_COMMIT.

Если вы хотите передать ссылку в runtime (при запуске изображение) вместо этого вы можете передать ссылку при запуске изображения; например, чтобы передать дайджест образа, который вы запускаете;

docker pull lab:latest

export IMAGE_DIGEST=$(docker inspect --format '{{ (index .RepoDigests 0) }}' lab:latest)

docker run -it --rm -e IMAGE_DIGEST=${IMAGE_DIGEST} lab:latest
0 голосов
/ 01 мая 2020

Когда вы создаете образ, передайте аргумент сборки с git га sh:

$ docker build --build-arg GIT_HASH=$(git rev-parse --short HEAD) -t yourimage .

И в вашем Dockerfile вы должны иметь:

ARG GIT_HASH

Я полагаю, что теперь у вас должна быть переменная окружения с git га sh, доступная для кода, работающего внутри полученного контейнера.

Длинная версия: https://pythonspeed.com/articles/identifying-images/

0 голосов
/ 01 мая 2020

Добавьте идентификатор фиксации к вашему тегу изображения.

Например: imagename: dev-v1- bc4da47

, где bc4da47 - последний идентификатор фиксации

Вы можете получить последний идентификатор коммита

git rev-parse --short HEAD
...