[docker] 기본 이미지가 업데이트 된 경우 도커 컨테이너를 자동으로 업데이트하는 방법

에 근거한 간단한 컨테이너가 있다고 가정 해보십시오 ubuntu:latest. 이제 보안 업데이트 ubuntu:latest가 있으며 docker repo에서 업데이트되었습니다.

  1. 로컬 이미지와 컨테이너가 뒤에서 실행되고 있는지 어떻게 알 수 있습니까?

  2. 도커 저장소 업데이트를 따르기 위해 로컬 이미지 및 컨테이너를 자동으로 업데이트하는 모범 사례가 있습니까? 실제로 기존 우분투 시스템에서 무인 업그레이드를 실행하는 것과 동일한 이점을 제공합니다.



답변

이를 수행하는 방법 중 하나는 CI / CD 시스템을 통해이를 수행하는 것입니다. 부모 이미지가 작성되면 해당 부모를 사용하여 이미지를 검색 할 수있는 무언가를 준비하십시오. 발견되면 새 버전의 이미지에 충돌하기 위해 풀 요청을 보냅니다. 모든 테스트가 통과되면 풀 요청이 병합되고 업데이트 된 부모를 기반으로 새 자식 이미지가 생깁니다. 이 방법을 사용하는 도구의 예는 https://engineering.salesforce.com/open-sourcing-dockerfile-image-update-6400121c1a75 에서 찾을 수 있습니다 .

공식 ubuntu이미지 에 의존하는 경우처럼 부모 이미지를 제어하지 않으면 부모 이미지 태그 또는 체크섬의 변화를 감지하는 툴링을 작성할 수 있습니다 (동일한 것은 아니며 태그는 변경 가능). 이에 따라 어린이 이미지 빌드를 호출하십시오.


답변

실행중인 컨테이너가 최신 이미지로 시작되었는지 확인하는 스크립트를 사용합니다. 또한 docker 이미지를 시작하기 위해 upstart init 스크립트를 사용합니다.

#!/usr/bin/env bash
set -e
BASE_IMAGE="registry"
REGISTRY="registry.hub.docker.com"
IMAGE="$REGISTRY/$BASE_IMAGE"
CID=$(docker ps | grep $IMAGE | awk '{print $1}')
docker pull $IMAGE

for im in $CID
do
    LATEST=`docker inspect --format "{{.Id}}" $IMAGE`
    RUNNING=`docker inspect --format "{{.Image}}" $im`
    NAME=`docker inspect --format '{{.Name}}' $im | sed "s/\///g"`
    echo "Latest:" $LATEST
    echo "Running:" $RUNNING
    if [ "$RUNNING" != "$LATEST" ];then
        echo "upgrading $NAME"
        stop docker-$NAME
        docker rm -f $NAME
        start docker-$NAME
    else
        echo "$NAME up to date"
    fi
done

그리고 초기화는

docker run -t -i --name $NAME $im /bin/bash


답변

‘도커 방식’은 도커 허브 자동화 빌드 를 사용하는 것 입니다. 저장소 링크 업스트림 용기가 재건 될 때 기능은 컨테이너를 다시 것이고, Webhooks 기능을 사용하면 알림을 보내드립니다.

웹 후크가 HTTP POST 호출로 제한되어있는 것 같습니다. 이를 잡으려면 서비스를 설정하거나 POST 중 하나를 사용하여 서비스를 이메일로 보내야합니다.

나는 그것을 보지 않았지만 새로운 Docker Universal Control Plane 에는 업데이트 된 컨테이너를 감지하고 다시 배포하는 기능이있을 수 있습니다.


답변

망루 를 사용 하여 컨테이너가 인스턴스화 된 이미지의 업데이트를보고 업데이트를 자동으로 가져 와서 업데이트 된 이미지를 사용하여 컨테이너를 다시 시작할 수 있습니다. 그러나 기반이되는 업스트림 이미지가 변경 될 때 사용자 지정 이미지를 다시 작성하는 문제는 해결되지 않습니다. 이것을 (1) 업스트림 이미지가 업데이트 된시기를 알고 (2) 실제 이미지를 재구성하는 두 부분으로 된 문제로 볼 수 있습니다. (1) 상당히 쉽게 해결할 수 있지만 (2) 로컬 빌드 환경 / 연습에 많이 의존하므로 일반화 된 솔루션을 만드는 것이 훨씬 더 어려울 수 있습니다.

Docker Hub의 자동 빌드 를 사용할 수있는 경우 리포지토리 링크 기능을 사용하여 전체 문제를 비교적 깔끔하게 해결할 수 있습니다. 이렇게하면 연결된 리포지토리 (아마 업스트림)가 업데이트 될 때 자동으로 재 빌드를 트리거 할 수 있습니다. 자동화 된 빌드가 발생할 때 알리도록 웹 후크 를 구성 할 수도 있습니다 . 이메일 또는 SMS 알림을 원하면 webhook을 IFTTT Maker에 연결할 수 있습니다 . IFTTT 사용자 인터페이스가 다소 혼란 스럽지만 Docker webhook을 https://maker.ifttt.com/trigger/docker_xyz_image_built / with / key / 에 게시하도록 구성했습니다 your_key.

로컬로 빌드해야하는 경우, 관심있는 리포지토리에 연결된 Docker Hub에서 더미 리포지토리를 만들어 업스트림 이미지가 업데이트 될 때 알림을받는 문제를 해결할 수 있습니다. 더미 리포지토리의 유일한 목적은 다시 빌드 될 때 웹 후크를 트리거하는 것입니다 (링크 된 리포지토리 중 하나가 업데이트되었음을 ​​의미). 이 웹 후크를 수신 할 수 있다면,이를 사용하여 다시 빌드를 시작할 수도 있습니다.


답변

나는 같은 문제가 있었고 unattended-upgrade매일 전화하는 cron 작업으로 간단하게 해결할 수 있다고 생각했습니다 .

내 의도는 이미지를 업데이트하고 최신 보안 업데이트로 새 도커 이미지를 배포하는 데 시간이 걸릴 수 있기 때문에 프로덕션 컨테이너의 보안 및 업데이트를 보장하는 자동 및 빠른 솔루션으로 사용하는 것입니다.

Github 후크를 사용 하여 이미지 빌드 및 배포를 자동화 할 수도 있습니다

보안 업데이트를 매일 자동으로 확인하고 설치 하는 기본 도커 이미지 를 만들었습니다 (에서 직접 실행할 수 있음 docker run itech/docker-unattended-upgrade).

또한 컨테이너에 업데이트가 필요한지 확인하기 위해 다른 접근 방식 을 발견했습니다.

내 완전한 구현 :

도커 파일

FROM ubuntu:14.04

RUN apt-get update \
&& apt-get install -y supervisor unattended-upgrades \
&& rm -rf /var/lib/apt/lists/*

COPY install /install
RUN chmod 755 install
RUN /install

COPY start /start
RUN chmod 755 /start

도우미 스크립트

설치

#!/bin/bash
set -e

cat > /etc/supervisor/conf.d/cron.conf <<EOF
[program:cron]
priority=20
directory=/tmp
command=/usr/sbin/cron -f
user=root
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
EOF

rm -rf /var/lib/apt/lists/*

ENTRYPOINT ["/start"]

스타트

#!/bin/bash

set -e

echo "Adding crontab for unattended-upgrade ..."
echo "0 0 * * * root /usr/bin/unattended-upgrade" >> /etc/crontab

# can also use @daily syntax or use /etc/cron.daily

echo "Starting supervisord ..."
exec /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf

편집하다

Docker 컨테이너로 실행 되는 작은 도구 docker-run 을 개발했으며 모든 또는 선택한 실행중인 컨테이너 내부의 패키지를 업데이트하는 데 사용할 수 있으며 임의의 명령을 실행하는데도 사용할 수 있습니다.

다음 명령으로 쉽게 테스트 할 수 있습니다.

docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run exec

기본적으로 date실행중인 모든 컨테이너에서 명령을 실행하고 결과를 표시합니다. 당신이 전달하는 경우 update대신 exec그것을 실행합니다 apt-get update다음에 apt-get upgrade -y실행중인 모든 용기에


답변

docker pull 을 실행하지 않고 컨테이너가 뒤에 있다는 것을 알 수 없습니다 . 그런 다음 이미지 를 다시 작성 하거나 재구성 해야합니다.

docker pull image:tag
docker-compose -f docker-compose.yml -f production.yml up -d --build

적절한 컨테이너에는 추가 항목이 필요하지 않지만 명령은 업그레이드를 완료하는 데 필요한 다른 항목과 함께 스크립트에 넣을 수 있습니다.


답변

Docker 이미지의 종속성 관리는 실제 문제입니다. 컨테이너 이미지를 모니터링하고 메타 데이터를 검사하여이를 지원하는 MicroBadger 도구를 구축 한 팀의 일원입니다 . 그 기능 중 하나는 관심있는 이미지 (예 : 기본 이미지)가 변경 될 때 호출되는 알림 웹 후크를 설정하는 것입니다.