ubuntu:latest
をベースにした簡単なコンテナがあるとしましょう。現在セキュリティアップデートがあり、ubuntu:latest
はdockerリポジトリで更新されています。
ローカルイメージとそのコンテナが遅れていることをどのようにして知ることができますか?
Docker repoの更新に追従するようにローカルのイメージとコンテナを自動的に更新するためのベストプラクティスはありますか。
それをする方法の1つはあなたのCI/CDシステムを通してこれを運転することです。あなたの親イメージが構築されたら、その親を使用しているイメージのためにあなたのgitリポジトリをスキャンするものを持ってください。見つかった場合は、新しいバージョンのイメージにバンプするプルリクエストを送信します。すべてのテストに合格した場合、pull要求はマージされ、更新された親に基づいて新しい子イメージができます。このアプローチをとるツールの例はここにあります: 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
Initは次のようになります。
docker run -t -i --name $NAME $im /bin/bash
'docker way'は docker hub自動ビルド を使うことです。上流のコンテナが再構築されると Repository Links 機能はあなたのコンテナを再構築し、 Webhooks 機能はあなたに通知を送ります。
WebフックはHTTP POST呼び出しに限定されているようです。あなたはそれらを捕らえるためにサービスを設定する必要があるでしょう、あるいはおそらくそこに電子メールサービスのためにPOSTの1つを使う必要があります。
まだ調べていませんが、新しい Docker Universal Control Plane には、更新されたコンテナを検出して再デプロイするための機能があるかもしれません。
コンテナがインスタンス化されているイメージの更新を監視し、自動的に更新を取得して更新されたイメージを使用してコンテナを再起動するには、 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つが更新されたことを意味します)。あなたがこのウェブフックを受け取ることができれば、あなたはあなたの側で再構築を引き起こすためにそれを使うことさえできます。
私は同じ問題を抱えており、毎日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
が実行されます。
あなたが実行しなければあなたのコンテナが後ろにあることを知らないでしょう docker pull 。それならあなたは 再構築 または 再構成 あなたの画像をする必要があるでしょう。
docker pull image:tag
docker-compose -f docker-compose.yml -f production.yml up -d --build
適切なコンテナーを追加する必要はありませんが、コマンドは、アップグレードを完了するために必要な他のものと共にスクリプトに入れることができます。
Dockerイメージの依存性管理は本当の問題です。私は、コンテナ画像の監視とメタデータの検査によってこれを支援するツール MicroBadger を作成したチームの一員です。その機能の1つは、関心のある画像(ベース画像など)が変更されたときに呼び出される通知Webフックを設定できるようにすることです。
本番で無人アップデートが必要かどうかについて、私は全体的な問題には触れません(私はそうは思わない)。だれかが役に立つと思ったときのために、ここに参考のために残しておきます。端末で次のコマンドを使用して、すべてのdockerイメージを最新バージョンに更新します。
# docker images | awk '(NR>1) && ($2!~/none/) {print $1":"$2}' | xargs -L1 docker pull
ここにはたくさんの答えがありますが、どれも私のニーズに合っていません。質問者の一番の質問に対する実際の回答が欲しいのですが。 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
もう1つのアプローチは、ベースイメージが非常に早く遅れて(そしてそれが起こる可能性が非常に高い)と仮定して、定期的に(例えば毎週)あなたのアプリケーションの別のイメージビルドを強制しそれからそれが変更されたら再配置することです。
私が言える限りでは、公式のDebianやJavaのような一般的なベースイメージはセキュリティの修正に対応するためにタグを更新しているので、タグは不変ではありません(もっと強い保証が必要ならば参照[image:@digest] ]、より最近のDockerバージョンで利用可能)したがって、docker build --pull
を使用して画像を作成する場合は、アプリケーションは参照している最新の基本画像タグを取得する必要があります。
可変タグは混乱を招く可能性があるため、これを行うたびにアプリケーションのバージョン番号を増やすことをお勧めします。そうすることで、少なくとも自分の側ではよりクリーンになります。
それで、私は先の答えの1つで提案されたスクリプトがあなたのアプリケーションのイメージを再構築しないのでそれが仕事をすることを確信していません - それはただベースimageタグを更新してそれからコンテナを再起動します、しかし新しいコンテナはまだ参照します古いベースイメージハッシュ.
コンテナーごとに1つのプロセスのみを実行するという考え方に反するので、コンテナー(または必要でなければ他のプロセス)でcronタイプのジョブを実行することは推奨しません(なぜこれが優れているのかについてはさまざまな議論があります。ここに入るつもりはない。
私の答えの前提:
アプローチ
加えて、メンテナが必要と感じているので、基本イメージをアップグレードすることができます/完全な新しい基本イメージを持つコンテナを定期的に構築することができます
長所
BLUF:コンテナへの変更を監視するための正しい挿入ポイントを見つけることは困難です。 DockerHubがこれを解決できれば素晴らしいでしょう。 (リポジトリリンクは言及されていますが、DockerHubで設定するときに注意してください - 「Docker Hubでベースイメージが更新されるたびにこのリポジトリでビルドをトリガーします。 )
これを自分で解決しようとしているときに、Webフックに関するいくつかの推奨事項を見たので、私が使用したいくつかの解決策について詳しく説明したいと思いました。
Microbadger.comを使用してコンテナー内の変更を追跡し、その通知Webフック機能を使用してアクションを起動します。私はこれをzapier.comで設定しました(ただし、カスタマイズ可能なwebhookサービスを使用することができます)。私のgithubリポジトリにAlpineをベースイメージとして使用する新しい問題を作成します。
RSSフィードを追跡して、上流のコンテナへのgitコミットを確認します。例 https://github.com/gliderlabs/docker-Alpine/commits/rootfs/library-3.8/x86_64 。私はzapier.comを使用してこのフィードを監視し、何かがコミットされたときはいつでもTravis-CIで私のコンテナーの自動ビルドをトリガーします。これは少し極端ですが、手動の介入のためにあなたのgitリポジトリで問題を開くといった他のことをするためにトリガーを変更することができます。
上記の回答も正しいです
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
あなたはこれを試してみました: https://github.com/v2tec/watchtower 。これは、他のコンテナを監視しているdockerコンテナ内で実行されているシンプルなツールです。ベースイメージが変更された場合は、プルされて再デプロイされます。
シンプルで素晴らしい解決策は 羊飼い
これは、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