আপনার ডকার পাত্রে কীভাবে স্বয়ংক্রিয়ভাবে আপডেট করবেন, যদি বেস-চিত্রগুলি আপডেট হয়


205

বলুন আমার উপর ভিত্তি করে একটি তুচ্ছ পাত্রে রয়েছে ubuntu:latest। এখন একটি সুরক্ষা আপডেট রয়েছে এবং ubuntu:latestডকার রেপোতে আপডেট করা হয়েছে।

  1. আমি কীভাবে জানব যে আমার স্থানীয় চিত্র এবং এর পাতাগুলি পিছনে চলছে?

  2. ডকার রেপো আপডেটগুলি অনুসরণ করার জন্য স্থানীয় চিত্র এবং পাত্রে স্বয়ংক্রিয়ভাবে আপডেট করার জন্য কিছু সেরা অনুশীলন রয়েছে যা অনুশীলনে আপনি প্রচলিত উবুন্টু-মেশিনে চালিত অপ্রয়োজনীয়-আপগ্রেডের সমান প্রশংসা করতে পারবেন


11
আমি ডকারের শুরু থেকেই এর উত্তর খুঁজছি। এটি আরও কিছুটা জটিল। যদি আমি অ্যাপাচি ইনস্টল করি (উদাহরণস্বরূপ) এবং এটি আপডেট হয়ে যায়, আমি পরে এটি ইনস্টল করার পরে থেকে বেস-চিত্রটি পরিবর্তন হয় না। আমি এখনও আপাচের জন্য অটো আপডেট পেতে চাই would আমি আসলে এই বিষয়ে আইআরসি-তে জিজ্ঞাসা করেছি এবং একটি উত্তর হিসাবে "আপস্ট্রিম অনুসরণ এবং আপডেটগুলিতে পুনর্নির্মাণ" পেয়েছি ...
ম্যাথিয়াস

8
খুশি আমি একমাত্র ভাবছি না। মনে হচ্ছে বিকাশযোগ্য এবং আধুনিক প্রযুক্তির তুলনায় ডকার ডেভসের পক্ষে প্রজননযোগ্যতা অধিক গুরুত্বপূর্ণ যা আমরা বছরের পর বছর ধরে করেছি।
hbogert

সমস্যাটি হ'ল ডকার হ'ল পাত্রে কেবল প্রযুক্তি। আমি মনে করি একটি বাস্তুতন্ত্রের চারদিকে বিকশিত হতে কিছুটা সময় প্রয়োজন। অন্যান্য সমস্যা আছে যা ডকার লগিংয়ের মতো সম্বোধন করে না।
ম্যাথিয়াস

3
যারা উত্তর দিয়েছেন তাদের সবাইকে ধন্যবাদ। আমি দুঃখিত আমি অনুগ্রহ বিভক্ত করতে পারে না। যদিও আমার সমস্যার চূড়ান্ত কোনও সমাধান হয়নি, আপনারা সবার কাছ থেকে ভাল ইনপুট ছিল।
ম্যাথিয়াস

1
@ ম্যাথিয়াসের জন্য, আমি যে সমাধানটি সবে যুক্ত করেছি তাতে একটি স্ক্রিপ্ট রয়েছে যা ধারক পোস্ট-টানে ​​ইনস্টল হওয়া প্যাকেজগুলির সুরক্ষা আপডেটগুলি পরীক্ষা করবে। বেস ইমেজ চেক করার জন্য এটির পৃথক স্ক্রিপ্টও রয়েছে।
এফএমস্ট্র্যাট

উত্তর:


8

এটি করার অন্যতম উপায় হ'ল এটি আপনার সিআই / সিডি সিস্টেমগুলির মাধ্যমে চালনা করা। একবার আপনার পিতামাতার চিত্রটি তৈরি হয়ে গেলে এমন কিছু পান যা পিতামাতাকে ব্যবহার করে আপনার গিট রেপগুলি স্ক্যান করে। যদি খুঁজে পাওয়া যায় তবে আপনি চিত্রের নতুন সংস্করণে টানতে একটি টান অনুরোধ প্রেরণ করতে পারেন। টান অনুরোধ, যদি সমস্ত পরীক্ষা পাস হয় তবে একীভূত করা হবে এবং আপডেট পিতামাতার উপর ভিত্তি করে আপনার একটি নতুন শিশু চিত্র থাকবে। এই পদ্ধতির গ্রহণকারী কোনও সরঞ্জামের উদাহরণ এখানে পাওয়া যাবে: https://engineering.salesforce.com/open-sourcing-dockerfile-image-update-6400121c1a75

আপনি যদি নিজের পিতামাতার চিত্রটি নিয়ন্ত্রণ না করেন তবে আপনি যদি সরকারী ubuntuচিত্রের উপর নির্ভর করে থাকেন তবে আপনি এমন কিছু সরঞ্জামাদি লিখতে পারেন যা পিতামাতার চিত্র ট্যাগ বা চেকসামে পরিবর্তনগুলি সনাক্ত করে (একই জিনিস নয়, ট্যাগগুলি পরিবর্তনযোগ্য) এবং অনুরোধ বাচ্চাদের চিত্র অনুসারে বিল্ড।


বাহ এটি একটি বড় হাতুড়ি, যা বলেছিল: যেহেতু আমি এই প্রশ্নটি জিজ্ঞাসা করেছি তখন থেকেই আমি বুঝতে পেরেছি যে বিল্ড সার্ভারই ​​এই সমস্যাটি মোকাবেলার জায়গা is আমি কিছু টুলিং দেখে খুশি। যদি আপনি জেনেরিক ধারণাগুলিতে আপনার পদ্ধতির ব্যাখ্যা করেন (এবং আপনার সঠিক সরঞ্জাম / প্রয়োগ নয়) এবং এটি উত্তরে অন্তর্ভুক্ত করে আমি সম্ভবত এটি গ্রহণ করব।
hbogert

ধন্যবাদ @ হবোগার্ট আমি উপরেরটি সম্পাদনা করেছি এবং আপনি যদি জনসাধারণের ছবি নিয়ে কাজ করে থাকেন তবে কী করবেন সে সম্পর্কে একটি ধারণা অন্তর্ভুক্ত করেছেন
Ma3oxuct

123

আমরা একটি স্ক্রিপ্ট ব্যবহার করি যা পরীক্ষা করে কোনও চলমান ধারক সর্বশেষ চিত্র সহ শুরু হয়েছে কিনা তা পরীক্ষা করে। আমরা ডকার ইমেজ শুরু করার জন্য আপস্টার্ট থ্রি স্ক্রিপ্টগুলিও ব্যবহার করি।

#!/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

1
এই মূল্যবান অবদানের জন্য অনেক ধন্যবাদ। এটি বেস ইমেজ আপডেট করার জন্য একটি ভাল উপায় মত মনে হয়। বাকী প্রশ্নটি হ'ল, আপনি কীভাবে একটি অ্যাপ্লিকেশন আপডেট করবেন (যেমন অ্যাপাচি) যা ডকফাইফিলের মধ্যে বিতরণের মাধ্যমে ইনস্টল করা হয়েছিল? অথবা আপনি কেবল প্রস্তুত তৈরি বেসগুলি ব্যবহার করেন যা কেবলমাত্র আপনার অ্যাপ্লিকেশন কোডের প্রয়োজন (কোনও ওয়েবসাইটের মতো)?
ম্যাথিয়াস

আমরা আমাদের চিত্রগুলি কনফিগার করতে প্যাকার এবং পুতুল ব্যবহার করি। আমাদের চিত্রগুলি তাদের সৃষ্টি পর উৎপাদন যেতে প্রস্তুত
bsuttor

@ ম্যাথিয়াস, আমার সম্পাদিত উত্তরটি দেখুন আমার কাছে একটি ছোট্ট সরঞ্জাম ডকার-রান রয়েছে যা আমি চলমান সমস্ত পাত্রে লিনাক্স (বর্তমানে ডিবিয়ান / উবুন্টু) প্যাকেজ আপডেট করতে ব্যবহার করছি।
আইটেক

3
কোনও চিত্রের ধারক (যেমন redis) এর একই নাম থাকলে , LATEST=`docker inspect --format "{{.Id}}" $IMAGE`ধারকটির তথ্য পাবেন। --type imageএটি ঠিক করতে যুক্ত করুন ।
প্যাট্রিক ফিশার

1
আপনার পোস্টের জন্য ধন্যবাদ। ডকারের কাছ থেকে চিত্র পেতে লুপের মধ্যে পুরো জিনিসটি মুড়ে ফেলার জন্য আমি এটি সংশোধন করেছি: for IMAGE in $(docker ps --format {{.Image}} -q | sort -u)
আরমান্ড

25

একটি 'ডকার ওয়ে' হ'ল ডকার হাব স্বয়ংক্রিয় বিল্ডগুলি ব্যবহার করা । সংগ্রহস্থলের প্রয়োগ লিংক যখন একটি আপস্ট্রিম ধারক পুনর্নির্মিত হয় বৈশিষ্ট্যটি আপনার ধারক পুনর্নির্মাণের হবে, এবং Webhooks বৈশিষ্ট্যটি আপনাকে একটি বিজ্ঞপ্তি পাঠাতে হবে।

দেখে মনে হচ্ছে ওয়েবহুকগুলি HTTP পোষ্ট কলগুলিতে সীমাবদ্ধ। এগুলি ধরার জন্য আপনাকে একটি পরিষেবা স্থাপন করতে হবে, বা সেবার পরিষেবাগুলিকে ইমেল করতে পোষ্টের একটি ব্যবহার করতে পারেন।

আমি এটি খতিয়ে দেখিনি, তবে নতুন ডকার ইউনিভার্সাল কন্ট্রোল প্লেনটিতে আপডেটযুক্ত পাত্রে সনাক্ত করতে এবং পুনরায় স্থাপনের জন্য একটি বৈশিষ্ট্য থাকতে পারে।


আমাকে এএমকিউ
goliatone

দুঃখের বিষয়, আপস্ট্রিম ট্রিগারগুলি আর উপলভ্য নয়: github.com/docker/hub-feedback/issues/1717
জুলিয়েন চস্তং

22

আপনি ব্যবহার করতে পারেন ওয়াচটাওয়ার একটি ধারক থেকে instantiated হয় চিত্রে আপডেটের জন্য ঘড়ি এবং স্বয়ংক্রিয়ভাবে আপডেট বৈঠাচালনা এবং আপডেট ইমেজ ব্যবহার করে ধারক পুনরায় আরম্ভ করা। যাইহোক, এটি আপনার নিজস্ব কাস্টম চিত্রগুলি পুনর্নির্মাণের সমস্যার সমাধান করতে পারে না যখন উপরের দিকে প্রবাহিত চিত্রটিতে কোনও পরিবর্তন আসে। আপনি এটি একটি দ্বি-অংশ সমস্যা হিসাবে দেখতে পেয়েছেন: (1) যখন একটি প্রবাহের চিত্রটি আপডেট করা হয়েছে তখন জেনে রাখা এবং (2) প্রকৃত চিত্র পুনর্নির্মাণের কাজটি করা। (1) মোটামুটি সহজে সমাধান করা যায়, তবে (২) আপনার স্থানীয় বিল্ড পরিবেশ / অনুশীলনের উপর অনেক বেশি নির্ভর করে, সুতরাং এর জন্য একটি সাধারণ সমাধান তৈরি করা সম্ভবত আরও শক্ত।

আপনি যদি ডকার হাবের স্বয়ংক্রিয় বিল্ডগুলি ব্যবহার করতে সক্ষম হন তবে সংগ্রহস্থল লিঙ্ক বৈশিষ্ট্যটি ব্যবহার করে পুরো সমস্যা তুলনামূলকভাবে পরিষ্কারভাবে সমাধান করা যেতে পারে , যা কোনও লিঙ্কযুক্ত সংগ্রহস্থল (সম্ভবত একটি প্রবাহ) আপডেট হয়ে গেলে স্বয়ংক্রিয়ভাবে একটি পুনর্নির্মাণকে ট্রিগার করতে দেয়। আপনি যখন একটি স্বয়ংক্রিয় বিল্ড ঘটে তখন আপনাকে অবহিত করতে একটি ওয়েব হুক কনফিগার করতে পারেন । আপনি যদি কোনও ইমেল বা এসএমএস বিজ্ঞপ্তি চান তবে আপনি ওয়েব হুক আইএফটিটিটি মেকারের সাথে সংযুক্ত করতে পারেন । আমি আইএফটিটিটি ব্যবহারকারীর ইন্টারফেসটি একধরণের বিভ্রান্তিকর হতে দেখেছি তবে আপনি ডকার ওয়েবহুকটি https://maker.ifttt.com/trigger/docker_xyz_image_built / / / key / এর সাথে পোস্ট করতে কনফিগার করবেন your_key

আপনার যদি স্থানীয়ভাবে নির্মাণের দরকার হয় তবে আপনার আগ্রহের রেপো (গুলি) এর সাথে যুক্ত ডকার হাবের একটি ডামি রেপো তৈরি করে যখন একটি আপ স্ট্রিম চিত্র আপডেট করা হয় তবে আপনি অন্তত নোটিফিকেশন পাওয়ার সমস্যাটি সমাধান করতে পারেন। ডামি রেপোর একমাত্র উদ্দেশ্য হ'ল এটি পুনর্নির্মাণের সময় কোনও ওয়েব হুককে ট্রিগার করা (যা বোঝায় যে এর লিঙ্কযুক্ত একটি রেপো আপডেট হয়েছিল)। আপনি যদি এই ওয়েবহুকটি গ্রহণ করতে সক্ষম হন তবে আপনি এটি নিজের পক্ষে পুনর্নির্মাণ করতে ট্রিগার করতেও ব্যবহার করতে পারেন।


1
প্রহরীদুর্গ যদিও ডকার সকেট ব্যবহার করে। সুরক্ষা দৃষ্টিকোণ থেকে যা হোস্ট মেশিনে রুট অ্যাক্সেস দিচ্ছে।
জোজি

1
এছাড়াও, ওয়াচটাওয়ার ডকার হাব ব্যতীত অন্য কোনও ব্যক্তিগত সংগ্রহস্থল থেকে চিত্রগুলি আপডেট করতে সক্ষম বলে মনে হচ্ছে না। আমাদের জন্য যারা আউুরে ব্যবহার করেন তাদের জন্য একটি ঝাঁকুনি।
টমাস আইডে

1
আপনি ব্যক্তিগত রেজিষ্ট্রিসমূহ ব্যবহার ব্যবহার করতে পারেন REPO_USERএবং REPO_PASSবিভিন্ন পরিবেশের। আরও তথ্যের জন্য ওয়াচটাওয়ার থেকে রিডম.এমডি একবার দেখুন: github.com/v2tec/watchtower#usage
আলেজান্দ্রো নরতেস

2
সতর্কতার শব্দ, প্রহরীটি তার রক্ষণাবেক্ষণকারী দ্বারা পরিত্যাজ্য হয় এবং ডকারহাবের চিত্রটি গিথুবযুক্ত চিত্রের সাথে আপ টু ডেট নেই।
এক্সানডারস্ট্রাইক

প্রহরীদুর্গ রেপো কন্ট্রেনার / ওয়াচটাওয়ারে স্থানান্তরিত হয়েছে বলে মনে হয় । এবং ডকারহাবের সাথে লিঙ্কযুক্ত অটোমেটেড বিল্ডগুলির সাথে কিছু সমস্যা রয়েছে, যেমন একই প্রশ্নের এই উত্তরটির দ্বারা উল্লেখ করা হয়েছে ।
chrki

10

আমার একই সমস্যা ছিল এবং ভেবেছিলাম এটি কেবল ক্রোন জব দ্বারা unattended-upgradeপ্রতিদিন কল করে সমাধান করা যেতে পারে ।

আমার ধারনাটি হ'ল এটি একটি স্বয়ংক্রিয় এবং দ্রুত সমাধান হিসাবে উত্পাদনের ধারকটি সুরক্ষিত এবং আপডেট হয়েছে তা নিশ্চিত করার কারণ এটি আমার চিত্রগুলি আপডেট করতে এবং সর্বশেষতম সুরক্ষা আপডেটের সাথে একটি নতুন ডকার চিত্র স্থাপন করতে পারে can

গিথুব হুকের সাহায্যে ইমেজ বিল্ড এবং স্থাপনার স্বয়ংক্রিয় করাও সম্ভব

আমি একটি বেসিক ডকার ইমেজ তৈরি করেছি যা স্বয়ংক্রিয়ভাবে প্রতিদিন সুরক্ষা আপডেটগুলি পরীক্ষা করে এবং ইনস্টল করে (সরাসরি চালিয়ে যেতে পারে 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 run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run exec

যা ডিফল্টরূপে dateসমস্ত চলমান পাত্রে কমান্ড কার্যকর করবে এবং ফলাফলগুলি প্রদর্শন করবে। আপনি পাস যদি updateপরিবর্তে execএটি চালানো হবে apt-get updateদ্বারা অনুসরণ apt-get upgrade -yচলমান সমস্ত পাত্রে


অযৌক্তিক-আপগ্রেডের বিষয়ে আমার উল্লেখটি ছিল কেবল অ-ডকার পরিবেশে সাদৃশ্য দেখাতে। আমার উদ্দেশ্য হ'ল এটি ডকার উপায়ে সমাধান করা (যদি এটি উপস্থিত থাকে তবে।) একটি পাত্রে অতিরিক্ত প্রক্রিয়া থাকা ডকার ইমোর উদ্দেশ্যকে মারধর করে। এটি আপস্ট্রিমটি তাদের ইমেজ আপডেট করার সময় এবং আপনার, ব্যবহারকারী, এটি আপনার বর্তমান ধারকটির উপরে চাপ দেওয়ার মধ্যে বিলম্বের সমস্যাটিকে প্যাচ করে। যদিও এটি অপ্রত্যাশিত-আপগ্রেডগুলি সহ 1 দিন পর্যন্ত সময় নিতে পারে, তাই .. এছাড়াও গিথুব রেফারেন্সটি সন্তোষজনক নয়, কারণ আপডেট পদ্ধতিটি এখন হোস্ট ওএসের উপর নির্ভরশীল।
hbogert

"ডকার ওয়ে" আপনাকে একই পাত্রে অন্যান্য প্রক্রিয়াগুলি চালানো থেকে বাধা দেয় না যদি সেগুলি দৃ related়ভাবে সম্পর্কিত হয় এবং স্কেলিবিলিটি বাধা সৃষ্টি করে না। এবং এই নির্দিষ্ট ব্যবহারের ক্ষেত্রে আপনার যখন অন্য চলমান প্রক্রিয়া সহ একটি ধারক থাকতে পারে তার একটি উত্তম উদাহরণ। (যেমন গিটল্যাবের জন্য চিত্রটি একই পাত্রে একাধিক বাধ্যতামূলক প্রক্রিয়া চালিত হওয়ার জন্য দেখুন )।
আইটেক

আমি কোনও চিত্রের মূল ফাংশনের সাথে শক্তভাবে সম্পর্কিত একটি আপডেট মেকানিজমকে কল করব না। এই সমাধানটি কোনও প্যাকেজ ম্যানেজারের উপর বোঝা চাপার পরিবর্তে প্রচলিত মেশিনে প্রতিটি অ্যাপ্লিকেশনকে তার নিজস্ব আপডেট পদ্ধতি দেওয়ার মতো। যদিও এটি একটি সমাধান, এটি আমার প্রশ্নের উত্তর দেয় না যা হ'ল স্বয়ংক্রিয়ভাবে স্থানীয় চিত্রগুলি আপডেট করে এবং তারপরে, পাত্রে পুনরায় কাজ করা উচিত। পাত্রে নিজেদের আপডেট করার সাথে সাথে আমরা আবার প্রচুর রাষ্ট্রের সাথে পরিচয় করিয়ে দিচ্ছি যার মধ্যে আমাদের কোনও ধারণা নেই যা ডকারের (আবার ইমো) বিপক্ষে is
hbogert

1
আপনার ডকারের চেয়ে উচ্চ স্তরের এমন কিছু প্রয়োজন হতে পারে যা Kubernetesবৃহত অবকাঠামো স্থাপনার জন্য দরকারী তবে গুগলের দ্বারা এটি এখনও ভারী বিকাশের মধ্যে রয়েছে। এই মুহুর্তে, আপনি এটিকে মোটামুটি সহজ উপায়ে জবাব দেওয়ার মতো একটি বিধানকারী সরঞ্জাম দিয়ে স্বয়ংক্রিয় করতে পারেন।
আইটেক

আপনার উদ্ধৃত "ভিন্ন দৃষ্টিভঙ্গি" হয়ত আমি যা খুঁজছিলাম। আপনার নিজস্ব অবদানটি "ফ্যাট পাত্রে" ব্যবহারযোগ্য বিকল্প হিসাবে মনে হচ্ছে। আমি অবশ্যই দু'জনকে আরও খানিকটা তাকাব, তোমার উত্তরের জন্য ধন্যবাদ thanks
ম্যাথিয়াস

7

আপনি জানেন না যে আপনার ধারকটি ডকার টান না চালিয়ে পিছনে রয়েছে । তারপর আপনি প্রয়োজন চাই পুনর্নির্মাণের বা পারস্পরিকতা হিসেবে আপনার ইমেজ।

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

কমান্ডগুলি একটি স্ক্রিপ্টে আপগ্রেড সম্পন্ন করার জন্য প্রয়োজনীয় অন্য কোনও কিছু যুক্ত করা যেতে পারে, যদিও একটি উপযুক্ত ধারক অতিরিক্ত অতিরিক্ত কিছু প্রয়োজন হয় না।


1: ঠিক আছে, তবে তারপরে আমাকে আমার সমস্ত স্থানীয় চিত্র দেখতে হবে, তাদের বেস চিত্রগুলি পেতে হবে, সেগুলি টানতে হবে। তারপরে চিত্রগুলি পুনর্নির্মাণ করুন যার বেস চিত্রগুলি পরিবর্তিত হয়েছে। তারপরে কনটেইনারগুলি বন্ধ করুন যার চিত্র পরিবর্তন হয়েছে এবং 'ডকার রান' এবং প্রয়োজনীয় পরামিতিগুলির সাহায্যে ধারকগুলি পুনরায় তৈরি করুন। এটি অত্যধিক ম্যানুয়াল মনে হচ্ছে। তবে এটি যদি স্থিতিস্থাপক হয় তবে আমি উত্তরটি গ্রহণ করব।
hbogert

আপনি গ্রহণ করার আগে দয়া করে অপেক্ষা করুন। সম্ভবত সেখানে কিছু আছে। আমি months মাস ধরে ডকার ব্যবহার করছি, তবে সর্বশেষতম অগ্রগতি রক্ষা করছি না।
seanmcl

কোনওভাবে, অভ্যন্তরীণভাবে, ডকার তার 'ক্যাচিং' ক্ষমতা সম্পাদনের জন্য চিত্রগুলির তুলনা করতে সক্ষম। সম্ভবত আপনি যে উপার্জনের একটি উপায় খুঁজে পেতে পারেন। অন্য কথায়, অন্তর্নিহিত চিত্রগুলি (বেসে ফিরে সমস্ত উপায়) পরিবর্তন হয়েছে কিনা তা পরীক্ষা করে দেখুন এবং তারপরে পুনর্নির্মাণের জন্য কোনও প্রক্রিয়া ট্রিগার করুন। দুর্ভাগ্যক্রমে, ক্যাচিং সে ক্ষেত্রে আপনাকে সহায়তা করবে না: পুরো চিত্রটি পুনর্নির্মাণ করা হবে কারণ বেস চিত্রটি পরিবর্তিত হয়েছে।
থম পার্কিন

5

ডকার চিত্রগুলির জন্য নির্ভরতা পরিচালনা একটি আসল সমস্যা। আমি এমন একটি দলের অংশ যা একটি ধারক মাইক্রোবেজার তৈরি করেছে , এটি ধারক ইমেজগুলি পর্যবেক্ষণ করে এবং মেটাডেটা পরিদর্শন করে with এর বৈশিষ্ট্যগুলির মধ্যে একটি হ'ল আপনাকে একটি বিজ্ঞপ্তি ওয়েব হুক সেট আপ করতে দেওয়া যা আপনার আগ্রহী কোনও চিত্র (যেমন একটি বেস চিত্র) পরিবর্তিত হলে কল হয় called


5

এখানে প্রচুর উত্তর রয়েছে তবে এগুলির কোনওোটাই আমার প্রয়োজন অনুসারে নয়। আমি প্রশ্নকারীর # 1 প্রশ্নের প্রকৃত উত্তর চেয়েছিলাম। Hub.docker.com এ কোনও চিত্র আপডেট করা হলে আমি কীভাবে জানতে পারি?

নীচের স্ক্রিপ্টটি প্রতিদিন চালানো যায়। প্রথম দৌড়ে, এটি এইচবি রেজিস্ট্রি থেকে ট্যাগ এবং আপডেটের তারিখগুলির একটি বেসলাইন পায় এবং সেগুলি স্থানীয়ভাবে সংরক্ষণ করে। তারপরে, প্রতিবার এটি চালিত হওয়ার পরে এটি নতুন ট্যাগ এবং আপডেটের তারিখের জন্য রেজিস্ট্রি পরীক্ষা করে। যেহেতু প্রতিবারই নতুন চিত্রের উপস্থিতি এটি পরিবর্তিত হয়, তাই বেস চিত্রটি পরিবর্তন হয়েছে কিনা তা আমাদের জানায়। লিপিটি এখানে:

#!/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শীর্ষে পরিবর্তনশীলটি পরিবর্তন করতে এবং আপনার প্রয়োজন অনুসারে ইমেইল বিজ্ঞপ্তি কমান্ডটি পরিবর্তন করতে চাইবেন । আমার জন্য, আমার এটি অন্য নেটওয়ার্কের যেখানে আমার এসএমটিপি রয়েছে সেখানে একটি সার্ভারে এসএসএইচ আছে। তবে আপনি খুব সহজেই 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
প্রথম স্ক্রিপ্টে এমকেডির সম্ভবত হওয়া উচিত: এমকেডির -p এছাড়াও, প্রথম স্ক্রিপ্ট ভিএআর 1 এর সাথে ভিএআর 2 এর তুলনা করে, ধরে নিও যে ওল্ডকে নতুন এর সাথে তুলনা করা উচিত। যদি সত্য হয় তবে এর অর্থ হ'ল এই স্ক্রিপ্টটি ওপি যা চাইবে তা সত্যিই করবে না, এটি ইনস্টলের সময় প্রথমে চালিত হয়েছিল। এটি, কী ইনস্টল করা হয়েছে সে সম্পর্কে সত্যই কিছু নির্ধারণ করা হচ্ছে না, কেবল যদি ফলাফলগুলি আগের
রানগুলির চেয়ে

5

আরেকটি পদ্ধতির ধারণা করা যেতে পারে যে আপনার বেস ইমেজটি খুব দ্রুত পিছনে চলে আসে (এবং এটি হওয়ার খুব সম্ভবত সম্ভাবনা রয়েছে) এবং আপনার অ্যাপ্লিকেশনটির নির্দিষ্ট সময়ে (উদাহরণস্বরূপ প্রতি সপ্তাহে) আরও একটি চিত্র তৈরি করতে বাধ্য করুন এবং যদি এটি পরিবর্তন হয়ে থাকে তবে পুনরায় স্থাপনা করুন।

যতদূর আমি বলতে পারি, অফিশিয়াল ডেবিয়ান বা জাভা-র মতো জনপ্রিয় বেস চিত্রগুলি সুরক্ষা সংশোধন করার জন্য তাদের ট্যাগ আপডেট করে, তাই ট্যাগগুলি পরিবর্তনযোগ্য নয় (যদি আপনি এর আরও দৃ guarantee় গ্যারান্টি চান তবে আপনার রেফারেন্সটি ব্যবহার করতে হবে [চিত্র: @ ডাইজেস্ট ], আরও সাম্প্রতিক ডকার সংস্করণে উপলব্ধ)। অতএব, আপনি যদি নিজের ইমেজটি তৈরি করতে চান docker build --pullতবে আপনার অ্যাপ্লিকেশনটি আপনার উল্লেখ করা বেস ইমেজ ট্যাগের সর্বশেষতম এবং সর্বাধিক পাওয়া উচিত।

যেহেতু মিউটটেবল ট্যাগগুলি বিভ্রান্তিকর হতে পারে, আপনি যতবারই এটি ব্যবহার করেন ততবার আপনার অ্যাপ্লিকেশনটির সংস্করণ নম্বর বৃদ্ধি করা ভাল যাতে কমপক্ষে আপনার পাশের জিনিসগুলি আরও পরিষ্কার থাকে।

সুতরাং আমি নিশ্চিত নই যে পূর্ববর্তী উত্তরগুলির মধ্যে একটিতে প্রস্তাবিত স্ক্রিপ্টটি কাজ করে, যেহেতু এটি আপনার অ্যাপ্লিকেশনটির চিত্রটি পুনর্নির্মাণ করে না - এটি কেবলমাত্র বেস ইমেজ ট্যাগটি আপডেট করে এবং এটি কনটেইনারটি পুনরায় আরম্ভ করে, তবে নতুন ধারকটি এখনও উল্লেখ করে পুরানো বেস ইমেজ হ্যাশ।

আমি কনটেইনারগুলিতে ক্রোন-টাইপ কাজ চালানোর পক্ষে পরামর্শ দেব না (বা অন্য কোনও প্রক্রিয়া, যদি না প্রয়োজনে না হয়) তবে এটি প্রতি কন্টেইনারটিতে কেবল একটি প্রক্রিয়া চালানোর মন্ত্রের বিপরীতে চলেছে (এটি আরও ভাল কেন তা সম্পর্কে বিভিন্ন যুক্তি রয়েছে, তাই আমি ' আমি এখানে যাব না going


4

আপনি উত্পাদনে অপ্রত্যাশিত আপডেট চান কিনা তা আমি পুরো প্রশ্নের মধ্যে যাচ্ছি না (আমি মনে করি না)। আমি কেবল এখানে এটি রেফারেন্সের জন্য রেখে দিচ্ছি যদি কেউ এটির কাজে লাগে। আপনার টার্মিনালে নিম্নলিখিত কমান্ডটি সহ আপনার সমস্ত ডকার চিত্রগুলি সর্বশেষ সংস্করণে আপডেট করুন:

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


1
কমান্ডটি সমস্ত চিত্র আপডেট করার জন্য কার্যকর, তবে এটি উত্পাদন চলমান কোনও পরিবর্তন করে না। পাত্রে এখনও পুরানো চিত্রগুলি থেকে স্টেমগুলি রয়েছে, যা এখন অবিকৃত নেই।
নয়

সত্য। এবং এখানে আরও একটি বই রয়েছে ... # docker system prune -a --volumes -fপুরাতন (
ঝোলা

4

আপডেট: Dependabot ব্যবহার করুন - https ://d dependabot.com/docker/

বিএলইউএফ: একটি ধারক পরিবর্তনের উপর নজরদারি করার জন্য সঠিক সন্নিবেশ পয়েন্টটি খুঁজে পাওয়া চ্যালেঞ্জ। এটি দুর্দান্ত হবে যদি ডকারহাব এটি সমাধান করে। (সংগ্রহস্থলের প্রয়োগ লিংক উল্লেখ করা হয়েছে কিন্তু নোট যখন তাদের স্থাপনের DockerHub অন - "। এই সংগ্রহস্থলের যখনই বেস ইমেজ Docker হাব আপডেট করা হয় ট্রিগার একটি build শুধু নন-অফিশিয়াল ইমেজ জন্য কাজ করে।" )

এটি নিজেই সমাধান করার চেষ্টা করার সময় আমি ওয়েব হুকসের জন্য বেশ কয়েকটি সুপারিশ দেখেছি তাই আমি যে কয়েকটি সমাধান ব্যবহার করেছি তার বিস্তৃত বিবরণ দিতে চাই।

  1. একটি পাত্রে পরিবর্তনগুলি ট্র্যাক করতে মাইক্রোবাজার.কম ব্যবহার করুন এবং কোনও ক্রিয়া ট্রিগার করতে এটির বিজ্ঞপ্তি ওয়েব হুক বৈশিষ্ট্যটি ব্যবহার করুন। আমি এটিকে zapier.com দিয়ে সেট আপ করেছি (তবে আপনি যে কোনও কাস্টমাইজেবল ওয়েবহুক পরিষেবা ব্যবহার করতে পারেন) আমার গিথুব সংগ্রহস্থলে একটি নতুন সমস্যা তৈরি করতে যা আলপাইনকে বেস চিত্র হিসাবে ব্যবহার করে।

    • পেশাদাররা: আপনি পদক্ষেপ নেওয়ার আগে গিথুবে মাইক্রোবাজারের দ্বারা প্রতিবেদনিত পরিবর্তনগুলি পর্যালোচনা করতে পারেন।
    • কনস: মাইক্রোবাজার আপনাকে একটি নির্দিষ্ট ট্যাগ ট্র্যাক করতে দেয় না। দেখে মনে হচ্ছে এটি কেবল 'সর্বশেষ' ট্র্যাক করে।
  2. একটি প্রবাহী ধারকটিতে গিট করার জন্য আরএসএস ফিডটি সন্ধান করুন। প্রাক্তন। https://github.com/gliderlabs/docker-alpine/commits/rootfs/library.3.8/x86_64 । আমি এই ফিডটি পর্যবেক্ষণ করতে এবং ট্র্যাভিস-সিআই-তে আমার ধারকটির একটি স্বয়ংক্রিয় বিল্ড ট্রিগার করার জন্য যেকোনো সময় প্রতিশ্রুতিবদ্ধ হওয়ার জন্য zapier.com ব্যবহার করেছি। এটি কিছুটা চরম তবে আপনি নিজের গিটার সংগ্রহস্থলে ম্যানুয়াল হস্তক্ষেপের জন্য কোনও সমস্যা খোলার মতো অন্যান্য কাজ করতে ট্রিগার পরিবর্তন করতে পারেন।

    • পেশাদাররা: একটি স্বয়ংক্রিয় পাইপলাইনের নিকটবর্তী। ট্র্যাভিস-সিআই বিল্ডটি কেবলমাত্র চেক করে দেখুন যে আপনার ধারকটি বেস ইমেজ সংগ্রহস্থলে প্রতিশ্রুতিবদ্ধ যা ছিল তাতে সমস্যা আছে কিনা। আপনার সিআই পরিষেবাদি যদি আরও কোনও পদক্ষেপ নেয় তবে এটি আপনার পক্ষে।
    • কনস: কমিট ফিডটি সন্ধান করা নিখুঁত নয়। প্রচুর জিনিস সংগ্রহস্থলের প্রতি প্রতিশ্রুতিবদ্ধ হয় যা বেস চিত্রটি তৈরি করতে প্রভাবিত করে না। ফ্রিকোয়েন্সি / কমিটের সংখ্যা এবং কোনও API থ্রোটলিংয়ের কোনও সমস্যা বিবেচনা করে না।

3

আমার জবাবের জায়গা:

  1. ধারকগুলি ট্যাগ সহ চালিত হয়।
  2. আমরা যথাযথ / যথাযথ বোধ করায় একই ট্যাগটি বিভিন্ন চিত্র ইউআইডি-তে নির্দেশিত হতে পারে।
  3. কোনও চিত্রে করা আপডেটগুলি একটি নতুন চিত্র স্তর প্রতিশ্রুতিবদ্ধ হতে পারে

অভিগমন

  1. সুরক্ষা-প্যাচ আপডেট স্ক্রিপ্টের সাহায্যে সমস্ত পাত্রে প্রথম স্থানে তৈরি করুন
  2. নিম্নলিখিতগুলির জন্য একটি স্বয়ংক্রিয় প্রক্রিয়া তৈরি করুন
    • কমান্ড হিসাবে সুরক্ষা প্যাচ স্ক্রিপ্ট সহ নতুন ধারকটিতে একটি বিদ্যমান চিত্র চালান
    • হিসাবে ইমেজ পরিবর্তন প্রতিশ্রুতিবদ্ধ
      • বিদ্যমান ট্যাগ -> তারপরে পাত্রগুলি একে একে পুনরায় চালু করার পরে
      • নতুন সংস্করণ ট্যাগ -> কয়েকটি পাত্রে নতুন ট্যাগ দিয়ে প্রতিস্থাপন করুন -> বৈধতা -> সমস্ত ধারককে নতুন ট্যাগে সরান

অতিরিক্ত হিসাবে, বেস চিত্রটি আপগ্রেড করা যায় / নিয়মিত বিরতিতে সম্পূর্ণ নতুন বেস চিত্র সহ ধারকটি তৈরি করা যায়, কারণ রক্ষণাবেক্ষণকারীকে প্রয়োজনীয় মনে হয়

সুবিধাদি

  1. নতুন সুরক্ষা প্যাচযুক্ত চিত্র তৈরি করার সময় আমরা চিত্রটির পুরানো সংস্করণ সংরক্ষণ করছি, অতএব আমরা প্রয়োজনে পূর্ববর্তী চলমান চিত্রটিতে রোলব্যাক করতে পারি
  2. আমরা ডকার ক্যাশে সংরক্ষণ করছি, অতএব নেটওয়ার্ক ট্রান্সফার কম (কেবল পরিবর্তিত স্তরটি তারের উপর দিয়ে যায়)
  3. প্রোডে যাওয়ার আগে মঞ্চে আপগ্রেড প্রক্রিয়াটি বৈধ হতে পারে
  4. এটি একটি নিয়ন্ত্রিত প্রক্রিয়া হতে পারে, অতএব সুরক্ষা প্যাচগুলি কেবল তখনই প্রয়োজন হয় যখন বিবেচনা করা / গুরুত্বপূর্ণ মনে করা যায় তবে তা চাপ দেওয়া যায়।

উত্পাদনের পরিবেশে, যদিও সেগুলি সুরক্ষা আপডেট, তবে আমি সন্দেহ করি যে আপনি অপ্রত্যাশিত আপডেট পেতে চাইবেন! যদি অপ্রয়োজনীয় আপডেট থাকা প্রয়োজন হয় তবে ক্রস জব হিসাবে নিয়মিত বিরতিতে (যথাযথভাবে) প্রক্রিয়াটি চালানো যেতে পারে।
ফানি

1
আমার ভিত্তিটি হ'ল সুরক্ষা আপডেটগুলি আপ স্ট্রিম / বেস চিত্রগুলি থেকে আসা উচিত।
hbogert

@ হবোগার্ট আমি বরং বলব তত্ত্ব এবং অনুশীলনের মধ্যে পার্থক্যের সূক্ষ্ম লাইন রয়েছে। যখন জিনিসগুলি বাস্তবে আসে, তখন অনেকগুলি বাহ্যিক দিক বিবেচনা করা দরকার, যেমন: ব্যয় (শুধুমাত্র ডলারের মূল্য নয়, সময়ও) বাস্তবায়নের সাথে সম্পর্কিত।
ফণী

3

উপরের উত্তরগুলিও সঠিক

দুটি অ্যাপ্রোচ আছে

  1. ওয়েবহুক ব্যবহার করুন
  2. ডকার ইমেজের টাটকা টান পেতে প্রতি নির্দিষ্ট মিনিটের জন্য স্ক্রিপ্ট চালান

আমি কেবল স্ক্রিপ্ট ভাগ করছি এটি আপনার পক্ষে সহায়ক হতে পারে! আপনি ক্রোনজব দিয়ে এটি ব্যবহার করতে পারেন, আমি ওএসএক্সে সফলতার সাথে চেষ্টা করেছি

#!/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

এখানে আমার ডকার-রচনা ফাইল

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

3

এখানে স্বয়ংক্রিয়ভাবে ডকারের ধারক আপডেট করার একটি সহজ উপায়

এর মাধ্যমে কাজটি রাখুন $ crontab -e:

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

~/.dockerফাইল সহ দির তৈরি করুন 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

আপনি কি এটি চেষ্টা করেছেন: https://github.com/v2tec/watchtower । এটি একটি সাধারণ সরঞ্জাম যা ডকার পাত্রে চলছে অন্য পাত্রে পর্যবেক্ষণ করছে, যদি তাদের বেসের চিত্রটি পরিবর্তন হয় তবে এটি টানতে এবং পুনরায় চালিত হবে।


-1

একটি সহজ এবং দুর্দান্ত সমাধান রাখাল হয়


দ্বিতীয়ত, এটি সাধারণ অর্থে সাহায্য করে না, কারণ এটি সোর্মের সাথে মিলিত হয়েছে এবং কেবল উজানে পুনরায় চালু হয়, যেখানে আমরা প্রবাহের পরিবর্তনগুলিতে প্রতিক্রিয়া দেখাতে, পুনর্নির্মাণ করতে চাই এবং কেবল পুনরায় আরম্ভ করতে চাই না।
hbogert

এটির মতো মনে হচ্ছে আপনার সিআই পাইপলাইনে কিছু করা উচিত
user672009
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.