web-dev-qa-db-ja.com

基本画像が更新された場合に、dockerコンテナを自動的に更新する方法

ubuntu:latestをベースにした簡単なコンテナがあるとしましょう。現在セキュリティアップデートがあり、ubuntu:latestはdockerリポジトリで更新されています。

  1. ローカルイメージとそのコンテナが遅れていることをどのようにして知ることができますか?

  2. Docker repoの更新に追従するようにローカルのイメージとコンテナを自動的に更新するためのベストプラクティスはありますか。

173
hbogert

それをする方法の1つはあなたのCI/CDシステムを通してこれを運転することです。あなたの親イメージが構築されたら、その親を使用しているイメージのためにあなたのgitリポジトリをスキャンするものを持ってください。見つかった場合は、新しいバージョンのイメージにバンプするプルリクエストを送信します。すべてのテストに合格した場合、pull要求はマージされ、更新された親に基づいて新しい子イメージができます。このアプローチをとるツールの例はここにあります: https://engineering.salesforce.com/open-sourcing-dockerfile-image-update-6400121c1a75

公式のubuntuイメージに頼っている場合のように、親イメージを制御しない場合は、親イメージタグの変更を検出してそれに従って子イメージビルドを呼び出すツールを作成できます。

7
Ma3oxuct

実行中のコンテナが最新のイメージで起動されているかどうかをチェックするスクリプトを使用します。また、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

Initは次のようになります。

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

'docker way'は docker hub自動ビルド を使うことです。上流のコンテナが再構築されると Repository Links 機能はあなたのコンテナを再構築し、 Webhooks 機能はあなたに通知を送ります。

WebフックはHTTP POST呼び出しに限定されているようです。あなたはそれらを捕らえるためにサービスを設定する必要があるでしょう、あるいはおそらくそこに電子メールサービスのためにPOSTの1つを使う必要があります。

まだ調べていませんが、新しい Docker Universal Control Plane には、更新されたコンテナを検出して再デプロイするための機能があるかもしれません。

21
CAB

コンテナがインスタンス化されているイメージの更新を監視し、自動的に更新を取得して更新されたイメージを使用してコンテナを再起動するには、 Watchtower を使用できます。ただし、それが基にしているアップストリームイメージに変更があった場合に、独自のカスタムイメージを再構築するという問題は解決されません。これは、2つの部分からなる問題と見なすことができます。(1)アップストリームイメージがいつ更新されたかを知ること、および(2)実際のイメージを再構築することです。 (1)はかなり簡単に解決できますが、(2)はあなたのローカルのビルド環境やプラクティスに大きく依存するので、そのための一般化されたソリューションを作成するのはおそらくもっと難しいです。

Docker Hubの 自動ビルド を使用できる場合は、 リポジトリリンク 機能を使用することで問題全体を比較的きれいに解決できます。これにより、リンクされたときに自動的に再構築を開始できます。リポジトリ(おそらく上流のもの)が更新されます。自動ビルドが行われたときに通知するように webhook を設定することもできます。電子メールまたはSMS通知が必要な場合は、Webフックを IFTTT Maker に接続してください。 IFTTTのユーザーインターフェイスはちょっと分かりにくいと思いましたが、Dockerウェブフックを https://maker.ifttt.com/trigger/docker_xyz_image_built/with/key/your_keyに投稿するように設定します。

ローカルでビルドする必要がある場合は、Docker Hubで目的のリポジトリにリンクしたダミーのリポジトリを作成することで、少なくともアップストリームイメージが更新されたときに通知を受け取るという問題を解決できます。ダミーリポジトリの唯一の目的は、再構築されたときにWebフックを起動することです(リンクされたリポジトリの1つが更新されたことを意味します)。あなたがこのウェブフックを受け取ることができれば、あなたはあなたの側で再構築を引き起こすためにそれを使うことさえできます。

19
jjlin

私は同じ問題を抱えており、毎日unattended-upgradeを呼び出すcronジョブで簡単に解決できると考えました。

私の意図は、イメージを更新して最新のセキュリティ更新で新しいdockerイメージを展開するのに時間がかかることがあるので、プロダクションコンテナが安全で更新されることを保証するための自動迅速なソリューションとしてこれを持つことです。

Github hooks を使ってイメージの構築と展開を自動化することも可能です。

基本的な docker image を作成しました。これは毎日自動的にセキュリティ更新をチェックしてインストールします(docker run itech/docker-unattended-upgradeによって直接実行できます)。

私はまた、コンテナが更新を必要としているかどうかをチェックするために別の異なる アプローチ に出くわしました。

私の完全な実装:

Dockerfile

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が実行されます。

9
iTech

あなたが実行しなければあなたのコンテナが後ろにあることを知らないでしょう docker pull 。それならあなたは 再構築 または 再構成 あなたの画像をする必要があるでしょう。

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

適切なコンテナーを追加する必要はありませんが、コマンドは、アップグレードを完了するために必要な他のものと共にスクリプトに入れることができます。

7
seanmcl

Dockerイメージの依存性管理は本当の問題です。私は、コンテナ画像の監視とメタデータの検査によってこれを支援するツール MicroBadger を作成したチームの一員です。その機能の1つは、関心のある画像(ベース画像など)が変更されたときに呼び出される通知Webフックを設定できるようにすることです。

4
Liz Rice

本番で無人アップデートが必要かどうかについて、私は全体的な問題には触れません(私はそうは思わない)。だれかが役に立つと思ったときのために、ここに参考のために残しておきます。端末で次のコマンドを使用して、すべてのdockerイメージを最新バージョンに更新します。

# docker images | awk '(NR>1) && ($2!~/none/) {print $1":"$2}' | xargs -L1 docker pull

4
Meferdati

ここにはたくさんの答えがありますが、どれも私のニーズに合っていません。質問者の一番の質問に対する実際の回答が欲しいのですが。 hub.docker.comで画像が更新されたことをどのように確認できますか?

以下のスクリプトは毎日実行できます。初回実行時に、HUBレジストリからタグのベースラインと更新日を取得し、それらをローカルに保存します。それ以降、それが実行されるたびに、新しいタグと更新日についてレジストリをチェックします。これは新しい画像が存在するたびに変わるので、ベース画像が変わったかどうかを教えてくれます。これがスクリプトです。

#!/bin/bash

DATAPATH='/data/docker/updater/data'

if [ ! -d "${DATAPATH}" ]; then
        mkdir "${DATAPATH}";
fi
IMAGES=$(docker ps --format "{{.Image}}")
for IMAGE in $IMAGES; do
        ORIGIMAGE=${IMAGE}
        if [[ "$IMAGE" != *\/* ]]; then
                IMAGE=library/${IMAGE}
        fi
        IMAGE=${IMAGE%%:*}
        echo "Checking ${IMAGE}"
        PARSED=${IMAGE//\//.}
        if [ ! -f "${DATAPATH}/${PARSED}" ]; then
                # File doesn't exist yet, make baseline
                echo "Setting baseline for ${IMAGE}"
                curl -s "https://registry.hub.docker.com/v2/repositories/${IMAGE}/tags/" > "${DATAPATH}/${PARSED}"
        else
                # File does exist, do a compare
                NEW=$(curl -s "https://registry.hub.docker.com/v2/repositories/${IMAGE}/tags/")
                OLD=$(cat "${DATAPATH}/${PARSED}")
                if [[ "${VAR1}" == "${VAR2}" ]]; then
                        echo "Image ${IMAGE} is up to date";
                else
                        echo ${NEW} > "${DATAPATH}/${PARSED}"
                        echo "Image ${IMAGE} needs to be updated";
                        H=`hostname`
                        ssh -i /data/keys/<KEYFILE> <USER>@<REMOTEHOST>.com "{ echo \"MAIL FROM: root@${H}\"; echo \"RCPT TO: <USER>@<EMAILHOST>.com\"; echo \"DATA\"; echo \"Subject: ${H} - ${IMAGE} needs update\"; echo \"\"; echo -e \"\n${IMAGE} needs update.\n\ndocker pull ${ORIGIMAGE}\"; echo \"\"; echo \".\"; echo \"quit\"; sleep 1; } | telnet <SMTPHOST> 25"
                fi

        fi
done;

一番上のDATAPATH変数を変更し、最後にemail通知コマンドを自分のニーズに合うように変更します。私にとっては、私のSMTPが配置されている別のネットワーク上のサーバーにSSHで接続します。しかし、mailコマンドも簡単に使用できます。

さて、あなたはコンテナ自身の中の更新されたパッケージもチェックしたいと思います。実際には、コンテナが機能し始めたら、「プル」を実行するよりも実際にはより効果的です。これをやめるスクリプトは次のとおりです。

#!/bin/bash


function needsUpdates() {
        RESULT=$(docker exec ${1} bash -c ' \
                if [[ -f /etc/apt/sources.list ]]; then \
                grep security /etc/apt/sources.list > /tmp/security.list; \
                apt-get update > /dev/null; \
                apt-get upgrade -oDir::Etc::Sourcelist=/tmp/security.list -s; \
                fi; \
                ')
        RESULT=$(echo $RESULT)
        GOODRESULT="Reading package lists... Building dependency tree... Reading state information... Calculating upgrade... 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded."
        if [[ "${RESULT}" != "" ]] && [[ "${RESULT}" != "${GOODRESULT}" ]]; then
                return 0
        else
                return 1
        fi
}

function sendEmail() {
        echo "Container ${1} needs security updates";
        H=`hostname`
        ssh -i /data/keys/<KEYFILE> <USRER>@<REMOTEHOST>.com "{ echo \"MAIL FROM: root@${H}\"; echo \"RCPT TO: <USER>@<EMAILHOST>.com\"; echo \"DATA\"; echo \"Subject: ${H} - ${1} container needs security update\"; echo \"\"; echo -e \"\n${1} container needs update.\n\n\"; echo -e \"docker exec ${1} bash -c 'grep security /etc/apt/sources.list > /tmp/security.list; apt-get update > /dev/null; apt-get upgrade -oDir::Etc::Sourcelist=/tmp/security.list -s'\n\n\"; echo \"Remove the -s to run the update\"; echo \"\"; echo \".\"; echo \"quit\"; sleep 1; } | telnet <SMTPHOST> 25"
}

CONTAINERS=$(docker ps --format "{{.Names}}")
for CONTAINER in $CONTAINERS; do
        echo "Checking ${CONTAINER}"
        if needsUpdates $CONTAINER; then
                sendEmail $CONTAINER
        fi
done
4
Fmstrat

もう1つのアプローチは、ベースイメージが非常に早く遅れて(そしてそれが起こる可能性が非常に高い)と仮定して、定期的に(例えば毎週)あなたのアプリケーションの別のイメージビルドを強制しそれからそれが変更されたら再配置することです。

私が言える限りでは、公式のDebianやJavaのような一般的なベースイメージはセキュリティの修正に対応するためにタグを更新しているので、タグは不変ではありません(もっと強い保証が必要ならば参照[image:@digest] ]、より最近のDockerバージョンで利用可能)したがって、docker build --pullを使用して画像を作成する場合は、アプリケーションは参照している最新の基本画像タグを取得する必要があります。

可変タグは混乱を招く可能性があるため、これを行うたびにアプリケーションのバージョン番号を増やすことをお勧めします。そうすることで、少なくとも自分の側ではよりクリーンになります。

それで、私は先の答えの1つで提案されたスクリプトがあなたのアプリケーションのイメージを再構築しないのでそれが仕事をすることを確信していません - それはただベースimageタグを更新してそれからコンテナを再起動します、しかし新しいコンテナはまだ参照します古いベースイメージハッシュ.

コンテナーごとに1つのプロセスのみを実行するという考え方に反するので、コンテナー(または必要でなければ他のプロセス)でcronタイプのジョブを実行することは推奨しません(なぜこれが優れているのかについてはさまざまな議論があります。ここに入るつもりはない。

4
Bogdan

私の答えの前提:

  1. コンテナはタグ付きで実行されます。
  2. 同じタグを別の画像のUUIDを指すようにしてもかまいません。
  3. 画像に対して行われた更新は、新しい画像レイヤにコミットできます。

アプローチ

  1. 最初にセキュリティパッチ更新スクリプトを使ってすべてのコンテナを構築します。
  2. 以下の自動プロセスを構築します。
    • コマンドとしてセキュリティパッチスクリプトを使用して、新しいコンテナに既存のイメージを実行します。
    • として画像への変更を確定します
      • 既存のタグ - >続いてコンテナを一つずつ再起動する
      • 新しいバージョンタグ - >いくつかのコンテナを新しいタグに置き換える - >検証 - >すべてのコンテナを新しいタグに移動する

加えて、メンテナが必要と感じているので、基本イメージをアップグレードすることができます/完全な新しい基本イメージを持つコンテナを定期的に構築することができます

長所

  1. 新しいセキュリティパッチが適用されたイメージを作成している間、イメージの古いバージョンを保持しているので、必要に応じて以前の実行中のイメージにロールバックできます。
  2. Dockerキャッシュを保持しているため、ネットワーク転送が少なくなります(変更されたレイヤだけが通信を開始します)。
  3. アップグレードプロセスは、製品に移行する前にステージングで検証できます。
  4. これは管理されたプロセスになる可能性があるため、必要な場合や重要と思われる場合にのみセキュリティパッチを適用することができます。
3
Phani

BLUF:コンテナへの変更を監視するための正しい挿入ポイントを見つけることは困難です。 DockerHubがこれを解決できれば素晴らしいでしょう。 (リポジトリリンクは言及されていますが、DockerHubで設定するときに注意してください - 「Docker Hubでベースイメージが更新されるたびにこのリポジトリでビルドをトリガーします。

これを自分で解決しようとしているときに、Webフックに関するいくつかの推奨事項を見たので、私が使用したいくつかの解決策について詳しく説明したいと思いました。

  1. Microbadger.comを使用してコンテナー内の変更を追跡し、その通知Webフック機能を使用してアクションを起動します。私はこれをzapier.comで設定しました(ただし、カスタマイズ可能なwebhookサービスを使用することができます)。私のgithubリポジトリにAlpineをベースイメージとして使用する新しい問題を作成します。

    • 長所:アクションを取る前に、githubでmicrobadgerによって報告された変更を確認できます。
    • 短所:Microbadgerでは、特定のタグを追跡することはできません。 「最新」のみを追跡しているようです。
  2. RSSフィードを追跡して、上流のコンテナへのgitコミットを確認します。例 https://github.com/gliderlabs/docker-Alpine/commits/rootfs/library-3.8/x86_64 。私はzapier.comを使用してこのフィードを監視し、何かがコミットされたときはいつでもTravis-CIで私のコンテナーの自動ビルドをトリガーします。これは少し極端ですが、手動の介入のためにあなたのgitリポジトリで問題を開くといった他のことをするためにトリガーを変更することができます。

    • 長所:自動化された分野に近い。 Travis-CIビルドは、ベースイメージリポジトリにコミットされたものにコンテナに問題があるかどうかを確認するだけです。あなたのCIサービスがそれ以上の行動を取るかどうかはあなた次第です。
    • 短所:コミットフィードの追跡は完璧ではありません。ベースイメージの構築に影響を与えない多くのことがリポジトリにコミットされます。コミットの頻度や回数、APIの調整に関する問題を考慮に入れていません。
2
2stacks

上記の回答も正しいです

2つのアプローチがあります

  1. ウェブフックを使う
  2. 特定の分ごとにスクリプトを実行して、dockerイメージを新鮮に取得します。

スクリプトを共有しているだけなので、参考になるかもしれません。あなたはcronjobでそれを使うことができます、私はOSXで首尾よく試みました

#!/bin/bash
##You can use below commented line for setting cron tab for running cron job and to store its O/P in one .txt file  
#* * * * * /usr/bin/Sudo -u admin -i bash -c /Users/Swapnil/Documents/checkimg.sh > /Users/Swapnil/Documents/cron_output.log 2>&1
# Example for the Docker Hub V2 API
# Returns all images and tags associated with a Docker Hub organization account.
# Requires 'jq': https://stedolan.github.io/jq/

# set username, password, and organization
# Filepath where your docker-compose file is present
FILEPATH="/Users/Swapnil/Documents/lamp-Alpine"
# Your Docker hub user name
UNAME="ur username"
# Your Docker hub user password
UPASS="ur pwd"
# e.g organisation_name/image_name:image_tag
ORG="ur org name"
IMGNAME="ur img name"
IMGTAG="ur img tag"
# Container name
CONTNAME="ur container name"
# Expected built mins
BUILDMINS="5"
#Generally cronjob frequency
CHECKTIME="5"
NETWORKNAME="${IMGNAME}_private-network"
#After Image pulling, need to bring up all docker services?
DO_DOCKER_COMPOSE_UP=true
# -------
echo "Eecuting Script @ date and time in YmdHMS: $(date +%Y%m%d%H%M%S)"
set -e
PIDFILE=/Users/Swapnil/Documents/$IMGNAME/forever.pid
if [ -f $PIDFILE ]
then
  PID=$(cat $PIDFILE)
  ps -p $PID > /dev/null 2>&1
  if [ $? -eq 0 ]
  then
    echo "Process already running"
    exit 1
  else
    ## Process not found assume not running
    echo $$
    echo $$ > $PIDFILE
    if [ $? -ne 0 ]
    then
      echo "Could not create PID file"
      exit 1
    fi
  fi
else
  echo $$ > $PIDFILE
  if [ $? -ne 0 ]
  then
    echo "Could not create PID file"
    exit 1
  fi
fi

# Check Docker is running or not; If not runing then exit
if docker info|grep Containers ; then
    echo "Docker is running"
else
    echo "Docker is not running"
    rm $PIDFILE
    exit 1
fi

# Check Container is running or not; and set variable
CONT_INFO=$(docker ps -f "name=$CONTNAME" --format "{{.Names}}")
if [ "$CONT_INFO" = "$CONTNAME" ]; then
    echo "Container is running"
    IS_CONTAINER_RUNNING=true
else
    echo "Container is not running"
    IS_CONTAINER_RUNNING=false
fi


# get token
echo "Retrieving token ..."
TOKEN=$(curl -s -H "Content-Type: application/json" -X POST -d '{"username": "'${UNAME}'", "password": "'${UPASS}'"}' https://hub.docker.com/v2/users/login/ | jq -r .token)

# get list of repositories
echo "Retrieving repository list ..."
REPO_LIST=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${ORG}/?page_size=100 | jq -r '.results|.[]|.name')

# output images & tags
echo "Images and tags for organization: ${ORG}"
echo
for i in ${REPO_LIST}
do
  echo "${i}:"
  # tags
  IMAGE_TAGS=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${ORG}/${i}/tags/?page_size=100 | jq -r '.results|.[]|.name')
  for j in ${IMAGE_TAGS}
  do
    echo "  - ${j}"
  done
  #echo
done

# Check Perticular image is the latest or not
#imm=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${ORG}/${IMGNAME}/tags/?page_size=100)
echo "-----------------"
echo "Last built date details about Image ${IMGNAME} : ${IMGTAG} for organization: ${ORG}"
IMAGE_UPDATED_DATE=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${ORG}/${IMGNAME}/tags/?page_size=100 | jq -r '.results|.[]|select(.name | contains("'${IMGTAG}'")).last_updated')
echo "On Docker Hub IMAGE_UPDATED_DATE---$IMAGE_UPDATED_DATE"
echo "-----------------"

IMAGE_CREATED_DATE=$(docker image inspect ${ORG}/${IMGNAME}:${IMGTAG} | jq -r '.[]|.Created')
echo "Locally IMAGE_CREATED_DATE---$IMAGE_CREATED_DATE"

updatedDate=$(date -jf '%Y-%m-%dT%H:%M' "${IMAGE_UPDATED_DATE:0:16}" +%Y%m%d%H%M%S) 
createdDate=$(date -jf '%Y-%m-%dT%H:%M' "${IMAGE_CREATED_DATE:0:16}" +%Y%m%d%H%M%S)
currentDate=$(date +%Y%m%d%H%M%S)

start_date=$(date -jf "%Y%m%d%H%M%S" "$currentDate" "+%s")
end_date=$(date -jf "%Y%m%d%H%M%S" "$updatedDate" "+%s")
updiffMins=$(( ($start_date - $end_date) / (60) ))
if [[ "$updiffMins" -lt $(($CHECKTIME+1)) ]]; then
        if [ ! -d "${FILEPATH}" ]; then
            mkdir "${FILEPATH}";
        fi
        cd "${FILEPATH}"
        pwd
        echo "updatedDate---$updatedDate" > "ScriptOutput_${currentDate}.txt"
        echo "createdDate---$createdDate" >> "ScriptOutput_${currentDate}.txt"
        echo "currentDate---$currentDate" >> "ScriptOutput_${currentDate}.txt"
        echo "Found after regular checking time -> Docker hub's latest updated image is new; Diff ${updiffMins} mins" >> "ScriptOutput_${currentDate}.txt"
        echo "Script is checking for latest updates after every ${CHECKTIME} mins" >> "ScriptOutput_${currentDate}.txt"
        echo "Fetching all new"
        echo "---------------------------"
        if $IS_CONTAINER_RUNNING ; then
            echo "Container is running"         
        else
            docker-compose down
            echo "Container stopped and removed; Network removed" >> "ScriptOutput_${currentDate}.txt"
        fi
        echo "Image_Created_Date=$currentDate" > ".env"
        echo "ORG=$ORG" >> ".env"
        echo "IMGNAME=$IMGNAME" >> ".env"
        echo "IMGTAG=$IMGTAG" >> ".env"
        echo "CONTNAME=$CONTNAME" >> ".env"
        echo "NETWORKNAME=$NETWORKNAME" >> ".env"
        docker-compose build --no-cache
        echo "Docker Compose built" >> "ScriptOutput_${currentDate}.txt"
        if $DO_DOCKER_COMPOSE_UP ; then
            docker-compose up -d
            echo "Docker services are up now, checked in" >> "ScriptOutput_${currentDate}.txt"  
        else
            echo "Docker services are down, checked in" >> "ScriptOutput_${currentDate}.txt"
        fi
Elif [[ "$updatedDate" -gt "$createdDate" ]]; then 
    echo "Updated is latest"
    start_date=$(date -jf "%Y%m%d%H%M%S" "$updatedDate" "+%s")
    end_date=$(date -jf "%Y%m%d%H%M%S" "$createdDate" "+%s")
    diffMins=$(( ($start_date - $end_date) / (60) ))
    if [[ "$BUILDMINS" -lt "$diffMins" ]]; then
        if [ ! -d "${FILEPATH}" ]; then
            mkdir "${FILEPATH}";
        fi
        cd "${FILEPATH}"
        pwd
        echo "updatedDate---$updatedDate" > "ScriptOutput_${currentDate}.txt"
        echo "createdDate---$createdDate" >> "ScriptOutput_${currentDate}.txt"
        echo "currentDate---$currentDate" >> "ScriptOutput_${currentDate}.txt"
        echo "Found after comparing times -> Docker hub's latest updated image is new; Diff ${diffMins} mins" >> "ScriptOutput_${currentDate}.txt"
        echo "Actual image built time is less i.e. ${diffMins} mins than MAX expexted BUILD TIME i.e. ${BUILDMINS} mins" >> "ScriptOutput_${currentDate}.txt"
        echo "Fetching all new" >> "ScriptOutput_${currentDate}.txt"
        echo "-----------------------------"
        if $IS_CONTAINER_RUNNING ; then
            echo "Container is running"         
        else
            docker-compose down
            echo "Container stopped and removed; Network removed" >> "ScriptOutput_${currentDate}.txt"
        fi
        echo "Image_Created_Date=$currentDate" > ".env"
        echo "ORG=$ORG" >> ".env"
        echo "IMGNAME=$IMGNAME" >> ".env"
        echo "IMGTAG=$IMGTAG" >> ".env"
        echo "CONTNAME=$CONTNAME" >> ".env"
        echo "NETWORKNAME=$NETWORKNAME" >> ".env"
        docker-compose build --no-cache
        echo "Docker Compose built" >> "ScriptOutput_${currentDate}.txt"
        if $DO_DOCKER_COMPOSE_UP ; then
            docker-compose up -d
            echo "Docker services are up now" >> "ScriptOutput_${currentDate}.txt"  
        else
            echo "Docker services are down" >> "ScriptOutput_${currentDate}.txt"
        fi
    Elif [[ "$BUILDMINS" -gt "$diffMins" ]]; then
        echo "Docker hub's latest updated image is NOT new; Diff ${diffMins} mins"
        echo "Docker images not fetched"
    else
        echo "Docker hub's latest updated image is NOT new; Diff ${diffMins} mins"
        echo "Docker images not fetched"
    fi
Elif [[ "$createdDate" -gt "$updatedDate" ]]; then 
    echo "Created is latest"
    start_date=$(date -jf "%Y%m%d%H%M%S" "$createdDate" "+%s")
    end_date=$(date -jf "%Y%m%d%H%M%S" "$updatedDate" "+%s")
    echo "Docker hub has older docker image than local; Older than $(( ($start_date - $end_date) / (60) ))mins"
fi
echo 
echo "------------end---------------"
rm $PIDFILE

これが私のdocker-composeファイルです。

version:  "3.2"
services:
  lamp-Alpine:
    build:
      context: .
    container_name: "${CONTNAME}"
    image: "${ORG}/${IMGNAME}:${IMGTAG}"
    ports:
      - "127.0.0.1:80:80"
    networks:
      - private-network 

networks:
  private-network:
    driver: bridge
2
Akshay Shikre

あなたはこれを試してみました: https://github.com/v2tec/watchtower 。これは、他のコンテナを監視しているdockerコンテナ内で実行されているシンプルなツールです。ベースイメージが変更された場合は、プルされて再デプロイされます。

0
linehrr

シンプルで素晴らしい解決策は 羊飼い

0
user672009

これは、dockerコンテナを自動的に更新する最も簡単な方法です。

$ crontab -eを介して仕事を入れてください:

0 * * * * sh ~/.docker/cron.sh

ファイル~/.dockerを使用してdir cron.shを作成します。

#!/bin/sh
if grep -Fqe "Image is up to date" << EOF
`docker pull ubuntu:latest`
EOF
then
    echo "no update, just do cleaning"
    docker system Prune --force
else
    echo "newest exist, recompose!"
    cd /path/to/your/compose/file
    docker-compose down --volumes
    docker-compose up -d
fi
0
Chetabahana