วิธีอัปเกรดคอนเทนเนอร์นักเทียบท่าหลังจากเปลี่ยนรูปภาพ


518

สมมติว่าผมได้ดึงอย่างเป็นทางการMySQL: 5.6.21 ภาพ

ฉันปรับใช้ภาพนี้ด้วยการสร้างคอนเทนเนอร์ docker หลายตัว

คอนเทนเนอร์เหล่านี้ทำงานเป็นระยะเวลาหนึ่งจนกว่าจะมีการเปิดตัว MySQL 5.6.22 รูปภาพอย่างเป็นทางการของ mysql: 5.6 ได้รับการปรับปรุงด้วยการเปิดตัวใหม่ แต่คอนเทนเนอร์ของฉันยังคงทำงาน 5.6.21

ฉันจะเผยแพร่การเปลี่ยนแปลงในภาพ (เช่นอัพเกรด MySQL distro) ไปยังคอนเทนเนอร์ที่มีอยู่ทั้งหมดได้อย่างไร อะไรคือวิธีที่เหมาะสมในการทำสิ่งนี้?

คำตอบ:


578

หลังจากประเมินคำตอบและศึกษาหัวข้อที่ฉันต้องการสรุป

ดูเหมือนว่านักเทียบท่าในการอัปเกรดตู้คอนเทนเนอร์จะเป็นดังต่อไปนี้:

ภาชนะบรรจุแอพลิเคชันไม่ควรเก็บข้อมูลแอพลิเคชัน วิธีนี้คุณสามารถแทนที่แอปคอนเทนเนอร์ด้วยเวอร์ชันที่ใหม่กว่าได้ทุกเมื่อโดยดำเนินการดังนี้:

docker pull mysql
docker stop my-mysql-container
docker rm my-mysql-container
docker run --name=my-mysql-container --restart=always \
  -e MYSQL_ROOT_PASSWORD=mypwd -v /my/data/dir:/var/lib/mysql -d mysql

คุณสามารถจัดเก็บข้อมูลทั้งในพื้นที่ (ในไดเรกทอรีติดตั้งเป็นปริมาตร) หรือพิเศษข้อมูลเท่านั้นภาชนะ (s) อ่านเพิ่มเติมเกี่ยวกับเรื่องนี้

การประยุกต์ใช้การอัพเกรด (เช่น. กับ yum / อัพเกรด apt-get) ภายในภาชนะจะถือเป็นต่อต้านรูปแบบ คอนเทนเนอร์ของแอปพลิเคชันควรจะไม่เปลี่ยนรูปซึ่งจะรับประกันพฤติกรรมการทำซ้ำ บางภาพแอปพลิเคชันอย่างเป็นทางการ (โดยเฉพาะ mysql: 5.6) ไม่ได้ออกแบบมาเพื่ออัปเดตตัวเอง (อัปเกรด apt-get จะไม่ทำงาน)

ฉันอยากจะขอบคุณทุกคนที่ให้คำตอบดังนั้นเราจะได้เห็นวิธีการที่แตกต่างกันทั้งหมด


31
จะทำอย่างไรถ้าจำเป็นต้องทำการโยกย้ายข้อมูล เซิร์ฟเวอร์ใหม่ไม่สามารถเมานท์ข้อมูลได้เนื่องจากอยู่ในรูปแบบเก่าต้องทราบว่ามีการย้ายข้อมูลเกิดขึ้นและเปลี่ยนการแสดงข้อมูล
Dor Rotman

12
ฉันคิดว่าผู้ออกแบบรูปภาพควรคำนึงถึงสิ่งนั้นและอนุญาตให้เรียกใช้คำสั่งที่กำหนดเอง (เช่นการย้ายข้อมูล) ในระหว่างการเรียกใช้คอนเทนเนอร์ครั้งแรก
Yaroslav Stavnichiy

2
บทความที่เกี่ยวข้อง: intercityup.com/blog/running-upgrading-mysql-server-docker
Dor Rotman

4
@static_rtti ทำอย่างไรdocker rename my-mysql-container trash-containerก่อนสร้างใหม่
Franklin Yu

4
จะมีคำสั่ง all-in-one ใด ๆ ในการอัปเดตคอนเทนเนอร์โดยไม่ต้องหยุดด้วยตนเองลบออกแล้วสร้างใหม่อีกครั้ง (ขึ้นอยู่กับอิมเมจใหม่ที่ถูกดึง)?
Michaël Perrin

83

ฉันไม่ชอบการติดตั้งไดรฟ์ข้อมูลเป็นลิงก์ไปยังไดเรกทอรีโฮสต์ดังนั้นฉันจึงคิดรูปแบบสำหรับการอัปเกรดคอนเทนเนอร์ของนักเทียบท่าด้วยคอนเทนเนอร์ที่จัดการโดยนักเทียบท่าทั้งหมด การสร้างคอนเทนเนอร์นักเทียบท่าใหม่ด้วย--volumes-from <container>จะให้ภาชนะใหม่ที่มีภาพที่อัปเดตที่ใช้ร่วมกันเป็นเจ้าของปริมาณการจัดการนักเทียบท่า

docker pull mysql
docker create --volumes-from my_mysql_container [...] --name my_mysql_container_tmp mysql

หากยังไม่ได้ลบต้นฉบับออกทันทีmy_mysql_containerคุณสามารถเปลี่ยนกลับไปเป็นคอนเทนเนอร์ที่ใช้งานได้หากคอนเทนเนอร์ที่อัปเกรดไม่มีข้อมูลที่ถูกต้องหรือไม่สามารถทดสอบสติได้

ณ จุดนี้ฉันมักจะเรียกใช้สคริปต์สำรองใด ๆ ที่ฉันมีสำหรับภาชนะเพื่อให้ตัวเองตาข่ายความปลอดภัยในกรณีที่มีอะไรผิดพลาด

docker stop my_mysql_container
docker start my_mysql_container_tmp

ตอนนี้คุณมีโอกาสที่จะทำให้แน่ใจว่าข้อมูลที่คุณคาดว่าจะอยู่ในที่เก็บใหม่นั้นอยู่ที่นั่นและทำการตรวจสอบสติ

docker rm my_mysql_container
docker rename my_mysql_container_tmp my_mysql_container

ปริมาณนักเทียบท่าจะติดอยู่ตราบใดที่มีคอนเทนเนอร์ใดใช้อยู่ดังนั้นคุณสามารถลบคอนเทนเนอร์ดั้งเดิมได้อย่างปลอดภัย เมื่อลบคอนเทนเนอร์ดั้งเดิมแล้วคอนเทนเนอร์ใหม่สามารถใช้ชื่อซ้ำกับต้นฉบับเพื่อสร้างทุกสิ่งให้สวยงามพอ ๆ กับที่เริ่มต้น

มีข้อดีสองประการที่สำคัญสำหรับการใช้รูปแบบนี้สำหรับการอัพเกรดคอนเทนเนอร์นักเทียบท่า ประการแรกมันไม่จำเป็นต้องเมานต์ไดรฟ์ไปยังไดเรกทอรีโฮสต์โดยอนุญาตให้โอนปริมาณไปยังคอนเทนเนอร์ที่อัพเกรดโดยตรง ประการที่สองคุณไม่เคยอยู่ในตำแหน่งที่ไม่มีตู้เทียบท่าที่ใช้งานได้ ดังนั้นหากการอัปเกรดล้มเหลวคุณสามารถย้อนกลับไปยังวิธีการทำงานก่อนหน้านี้ได้อย่างง่ายดายโดยการหมุนคอนเทนเนอร์นักเทียบท่าเดิมอีกครั้ง


3
ทำไมคุณไม่ชอบเมานท์วอลลุ่มโฮสต์ภายในคอนเทนเนอร์ Docker (ฉันทำอย่างแม่นยำดังนั้นฉันจึงสนใจในการโต้แย้งว่า: -) ฉันได้ติดตั้งเช่น: ./postgres-data/:/var/lib/postgres/data- ติดตั้งโฮสต์ dir ./postgres-data/ภายในคอนเทนเนอร์ PostgreSQL ของฉัน)
KajMagnus

4
@KajMagnus ฉันใช้นักเทียบท่าฝูงมากและฉันชอบที่จะเขียนภาชนะของฉันให้ทำงานได้ดีในฝูง เมื่อฉันหมุนคอนเทนเนอร์ในกลุ่มฉันไม่รู้ว่าโหนดกลุ่มใดที่คอนเทนเนอร์กำลังใช้งานอยู่ดังนั้นฉันจึงไม่สามารถพึ่งพาเส้นทางโฮสต์ที่มีข้อมูลที่ฉันต้องการ เนื่องจาก Docker 1.9 (ฉันคิดว่า) สามารถแชร์ไดรฟ์ข้ามโฮสต์ซึ่งทำให้การอัปเกรดและย้ายข้อมูลคอนเทนเนอร์ทำได้ง่ายโดยใช้วิธีที่ฉันอธิบาย อีกทางเลือกหนึ่งคือตรวจสอบให้แน่ใจว่าไดรฟ์ข้อมูลเครือข่ายบางส่วนติดตั้งอยู่บนโหนดทั้งหมดของกลุ่ม
kMaiSmith

ขอบคุณ! ตกลงติดตั้งไดรฟ์ข้อมูลโฮสต์ดูเหมือนว่าสิ่งที่ฉันต้องการหลีกเลี่ยงเกินไปตอนนี้ อย่างน้อยอีกเล็กน้อยในภายหลังหากแอปของฉันเป็นที่นิยมและต้องการขยายไปยังเซิร์ฟเวอร์มากกว่าหนึ่งเครื่อง
KajMagnus

32

เพียงเพื่อให้คำตอบทั่วไป (ไม่ใช่ MySQL เฉพาะเจาะจง)

  1. ในระยะสั้น

ซิงโครไนซ์กับการลงทะเบียนรูปภาพบริการ ( https://docs.docker.com/compose/compose-file/#image ):

docker-compose pull 

สร้างคอนเทนเนอร์ใหม่หากไฟล์หรือรูปภาพประกอบนักเทียบท่ามีการเปลี่ยนแปลง:

docker-compose up -d
  1. พื้นหลัง

การจัดการอิมเมจคอนเทนเนอร์เป็นหนึ่งในเหตุผลในการใช้นักเทียบท่า (ดูที่https://docs.docker.com/compose/reference/up/ )

หากมีคอนเทนเนอร์ที่มีอยู่สำหรับบริการและการกำหนดค่าหรือรูปภาพของบริการเปลี่ยนไปหลังจากการสร้างตู้คอนเทนเนอร์นักเทียบท่าจะรับการเปลี่ยนแปลงโดยการหยุดและสร้างตู้คอนเทนเนอร์ใหม่ (เก็บวอลุ่มที่ติดตั้งไว้) เพื่อป้องกันไม่ให้การรวบรวมเกิดการเปลี่ยนแปลงให้ใช้แฟล็ก --no-recreate

ด้านการจัดการข้อมูลที่ครอบคลุมโดยนักเทียบท่าเขียนผ่าน "ไดรฟ์" ภายนอกที่เมาท์ (ดูhttps://docs.docker.com/compose/compose-file/#volumes ) หรือที่เก็บข้อมูล

สิ่งนี้ทำให้ความเข้ากันได้ย้อนหลังและปัญหาการโยกย้ายข้อมูลที่ไม่ได้ถูกแตะต้อง แต่สิ่งเหล่านี้เป็นปัญหา "การใช้งาน" ไม่ใช่เฉพาะนักเทียบท่าซึ่งจะต้องตรวจสอบกับบันทึกประจำรุ่นและการทดสอบ ...


คุณทำสิ่งนี้อย่างไรกับการกำหนดเวอร์ชัน ตัวอย่างภาพใหม่คือ foo / image: 2 และ docker-compose.yml มีภาพ: foo / image: 1?
dman

ขอบคุณ. คำตอบที่ดีที่สุด!
มิก

ขณะนี้เป็นวิธีการไปแน่นอนควรทราบว่าการเปลี่ยนแปลงใด ๆ ที่ทำในภาชนะจะยังคงหายไปเมื่อคอนเทนเนอร์ถูกสร้างขึ้นใหม่ ดังนั้นการเปลี่ยนคอนเทนเนอร์ให้อยู่ในโวลุ่มที่เมาท์จึงยังจำเป็น
Petr Bodnár

23

ฉันต้องการเพิ่มว่าถ้าคุณต้องการทำกระบวนการนี้โดยอัตโนมัติ (ดาวน์โหลดหยุดและรีสตาร์ทคอนเทนเนอร์ใหม่ด้วยการตั้งค่าเดียวกันตามที่อธิบายโดย @Yaroslav) คุณสามารถใช้ WatchTower ได้ โปรแกรมที่อัปเดตคอนเทนเนอร์ของคุณโดยอัตโนมัติเมื่อมีการเปลี่ยนแปลงhttps://github.com/v2tec/watchtower


20

พิจารณาคำตอบนี้:

  • ชื่อฐานข้อมูลคือ app_schema
  • ชื่อคอนเทนเนอร์คือ app_db
  • รหัสผ่านรูทคือ root123

วิธีอัปเดต MySQL เมื่อเก็บข้อมูลแอปพลิเคชันภายในคอนเทนเนอร์

นี่ถือว่าเป็นแนวปฏิบัติที่ไม่ดีเพราะถ้าคุณทำคอนเทนเนอร์หายคุณจะสูญเสียข้อมูล แม้ว่าจะเป็นการฝึกฝนที่ไม่ดี แต่นี่เป็นวิธีที่เป็นไปได้:

1) ทำการดัมพ์ฐานข้อมูลเป็น SQL:

docker exec app_db sh -c 'exec mysqldump app_schema -uroot -proot123' > database_dump.sql

2) อัปเดตภาพ:

docker pull mysql:5.6

3) อัปเดตคอนเทนเนอร์:

docker rm -f app_db
docker run --name app_db --restart unless-stopped \
-e MYSQL_ROOT_PASSWORD=root123 \
-d mysql:5.6

4) กู้คืนดัมพ์ของฐานข้อมูล:

docker exec app_db sh -c 'exec mysql -uroot -proot123' < database_dump.sql

วิธีอัปเดตคอนเทนเนอร์ MySQL โดยใช้ไดรฟ์ข้อมูลภายนอก

การใช้ไดรฟ์ข้อมูลภายนอกเป็นวิธีที่ดีกว่าในการจัดการข้อมูลและทำให้การปรับปรุง MySQL ง่ายขึ้น การสูญเสียคอนเทนเนอร์จะไม่ทำให้ข้อมูลสูญหาย คุณสามารถใช้นักเทียบท่าเพื่ออำนวยความสะดวกในการจัดการแอปพลิเคชันนักเทียบท่าหลายคอนเทนเนอร์ในโฮสต์เดียว:

1) สร้างdocker-compose.ymlไฟล์เพื่อจัดการแอปพลิเคชันของคุณ:

version: '2'
services:
  app_db:
    image: mysql:5.6
    restart: unless-stopped
    volumes_from: app_db_data
  app_db_data:
    volumes: /my/data/dir:/var/lib/mysql

2) อัพเดท MySQL (จากโฟลเดอร์เดียวกับdocker-compose.ymlไฟล์):

docker-compose pull
docker-compose up -d

หมายเหตุ: คำสั่งสุดท้ายข้างต้นจะอัปเดตอิมเมจ MySQL สร้างใหม่และเริ่มคอนเทนเนอร์ด้วยอิมเมจใหม่


สมมติว่าฉันมีฐานข้อมูลขนาดใหญ่ (หลาย GB) ข้อมูลของฉันจะไม่สามารถเข้าถึงได้จนกว่าจะนำเข้าฐานข้อมูลทั้งหมดหรือไม่ นั่นอาจเป็น "การหยุดทำงาน" ครั้งใหญ่
hellimac

ตั้งแต่ที่คุณพูดถึงdocker-composeจะใช้งานได้ไหม stackoverflow.com/a/31485685/65313
sivabudh

1
volumes_fromตอนนี้คีย์เลิกใช้แล้ว (แม้ลบในไฟล์เขียนเวอร์ชัน 3) แทนvolumesคีย์ใหม่
Franklin Yu

docker pull image_uri:tag && docker restart container_running_that_imageทำงานให้ฉัน docker-compose pull && docker-compose up -dไม่จำเป็นต้อง
Yuriy Pozniak

16

คำตอบที่คล้ายกับข้างบน

docker images | awk '{print $1}' | grep -v 'none' | grep -iv 'repo' | xargs -n1 docker pull

1
ยอดเยี่ยม! ค่อนข้างประหลาดใจที่มันไม่ได้รับคะแนนมากขึ้น ตอนนี้สิ่งเดียวที่ขาดหายไปคือการเริ่มต้นการรีสตาร์ทคอนเทนเนอร์ทั้งหมดที่อัพเดต
sorin

7
น่าเสียดายที่นี่จะไม่อัปเดตคอนเทนเนอร์ที่มีอยู่ นี่จะเป็นการอัพเดตอิมเมจที่ดึงออกมา แต่คอนเทนเนอร์ที่มีอยู่นั้นไม่เปลี่ยนรูปและยังคงใช้อิมเมจดั้งเดิมที่ใช้ในการสร้าง ใช้งานได้เฉพาะเมื่อคุณสร้างคอนเทนเนอร์ใหม่จากอิมเมจ แต่คอนเทนเนอร์ที่มีอยู่ใด ๆ จะยังคงยึดตามอิมเมจดั้งเดิม
Eric B.

น่าอัศจรรย์ หากคุณต้องการดึงเวอร์ชันเฉพาะของคอนเทนเนอร์ให้ทำดังนี้: docker images | awk '{พิมพ์ $ 1 ":" $ 2}' | grep -v 'none' | grep -iv 'repo' | xargs -n1 docker pull
rogervila

11

นี่คือสิ่งที่ดูเหมือนว่าใช้เมื่อมีการสร้างที่กำหนดเองdocker-composeDockerfile

  1. สร้าง Dockerfile ที่กำหนดเองก่อนจากนั้นจึงเพิ่มหมายเลขรุ่นถัดไปเพื่อแยกความแตกต่าง เช่นdocker build -t imagename:version . นี้จะเก็บเวอร์ชันใหม่ของคุณไว้ในเครื่อง
  2. วิ่ง docker-compose down
  3. แก้ไขdocker-compose.ymlไฟล์ของคุณเพื่อสะท้อนชื่อภาพใหม่ที่คุณตั้งไว้ในขั้นตอนที่ 1
  4. docker-compose up -dวิ่ง มันจะค้นหาภาพในเครื่องและใช้ภาพที่อัปเกรดแล้ว

-EDIT-

ขั้นตอนข้างต้นของฉันนั้นละเอียดยิ่งกว่าที่พวกเขาต้องการ ฉันเพิ่มประสิทธิภาพเวิร์กโฟลว์ของฉันโดยการรวมbuild: .พารามิเตอร์เข้ากับไฟล์นักเทียบท่าเขียนของฉัน ขั้นตอนดังกล่าวเป็นดังนี้:

  1. ตรวจสอบว่า Dockerfile ของฉันเป็นสิ่งที่ฉันต้องการให้มันเป็น
  2. ตั้งหมายเลขเวอร์ชั่นของชื่อภาพของฉันในไฟล์เขียนของนักเทียบท่า
  3. หากภาพของฉันยังไม่ได้สร้างให้เรียกใช้ docker-compose build
  4. วิ่ง docker-compose up -d

ฉันไม่ได้ตระหนักถึงเวลา แต่นักแต่งเพลงนั้นฉลาดพอที่จะอัปเดตคอนเทนเนอร์ของฉันเป็นรูปภาพใหม่ด้วยคำสั่งเดียวแทนที่จะต้องทำให้มันลงก่อน


ในสถานการณ์จริงคุณไม่สามารถใช้มือของคุณเองและทำการเปลี่ยนแปลงเหล่านั้นได้ โซลูชันของคุณไม่สนับสนุนวิธีอัตโนมัติในการแก้ปัญหา
Carlos Vázquez Losada

7
ดังนั้นคุณบอกว่าเพราะวิธีการแก้ปัญหาของฉันไม่อัตโนมัติมันไม่ถูกต้อง? นั่นเป็นข้อกำหนดจาก OP หรือไม่? และเป็นคำตอบอื่น ๆ ที่หมายถึงระบบอัตโนมัติ? สับสนจริงๆ และฉันคิดว่า downvotes กำลังก่อความเสียหายแก่ผู้อื่นที่มาที่นี่ คำตอบของฉันถูกต้อง 100% สำหรับคำถามที่ถาม
gdbj

ขอบคุณสำหรับคำตอบนี้ฉันไม่ได้ตระหนักว่าคุณสามารถวิ่งได้docker-compose up -dโดยไม่จำเป็นต้องหยุดทุกอย่างก่อน
radicand

4

หากคุณไม่ต้องการใช้ Docker Compose ฉันสามารถแนะนำตัวยึดได้ มันมีฟังก์ชั่นการสร้างใหม่ที่ช่วยให้คุณสร้างคอนเทนเนอร์อีกครั้งในขณะที่ดึงภาพล่าสุด


2

คุณต้องสร้างอิมเมจทั้งหมดใหม่และรีสตาร์ทคอนเทนเนอร์ทั้งหมดหรือ yum ปรับปรุงซอฟต์แวร์และรีสตาร์ทฐานข้อมูล ไม่มีเส้นทางอัปเกรด แต่คุณออกแบบด้วยตัวเอง


คุณหมายความว่าอย่างไรโดยการรีสตาร์ทคอนเทนเนอร์? มีdocker restartคำสั่งอยู่แต่ฉันไม่แน่ใจว่ามันจะรับภาพการเปลี่ยนแปลง และจะเกิดอะไรขึ้นกับข้อมูลของฉันภายในตู้คอนเทนเนอร์?
Yaroslav Stavnichiy

1
ขออภัยฉันไม่ได้แปลว่านักเทียบท่ารีสตาร์ท ฉันหมายถึงนักเทียบท่า rm -f CONTANER; นักเทียบท่าวิ่ง NEW_IMAGE ข้อมูลในคอนเทนเนอร์ sql ของคุณจะหายไป นั่นคือเหตุผลที่คนทั่วไปมักจะใช้วอลลุ่มเพื่อจัดเก็บข้อมูล
seanmcl

หากคุณมีข้อมูลทั้งหมดของคุณติดตั้งในไดรฟ์ข้อมูลในภาชนะที่แยกต่างหากหรือเครื่องโฮสต์ nas @seanmcl กล่าวว่าเพียงแค่สร้างภาชนะใหม่ที่มี mysql ใหม่เชื่อมต่อกับข้อมูลเดียวกัน หากคุณไม่ได้ทำเช่นนั้น (คุณควร) แต่คุณสามารถใช้คำสั่ง docker exec ที่มีอยู่ใน docker 1.3 เพื่ออัพเดท mysql และรีสตาร์ทมันภายในคอนเทนเนอร์
Usman Ismail

2

รับจากhttp://blog.stefanxo.com/2014/08/update-all-docker-images-at-once/

คุณสามารถอัปเดตรูปภาพที่มีอยู่ทั้งหมดโดยใช้ขั้นตอนต่อไปนี้:

docker images | awk '/^REPOSITORY|\<none\>/ {next} {print $1}' | xargs -n 1 docker pull

6
นี่จะอัปเดตรูปภาพ แต่ไม่ใช่คอนเทนเนอร์ ภาชนะไม่เปลี่ยนรูปและเป็นภาพฐานไม่สามารถเปลี่ยนแปลงได้โดยไม่ต้องสร้างภาชนะใหม่จากภาพที่อัปเดต
Eric B.

2

ตรวจสอบให้แน่ใจว่าคุณใช้วอลุ่มสำหรับข้อมูลถาวรทั้งหมด (การกำหนดค่าบันทึกหรือข้อมูลแอปพลิเคชัน) ที่คุณจัดเก็บไว้ในคอนเทนเนอร์ที่เกี่ยวข้องกับสถานะของกระบวนการภายในคอนเทนเนอร์นั้น อัปเดต Dockerfile ของคุณและสร้างภาพใหม่ด้วยการเปลี่ยนแปลงที่คุณต้องการและรีสตาร์ทคอนเทนเนอร์ด้วยโวลุ่มของคุณในตำแหน่งที่เหมาะสม


1

นี่คือสิ่งที่ฉันยังดิ้นรนเพื่อภาพของตัวเอง ฉันมีสภาพแวดล้อมเซิร์ฟเวอร์ที่ฉันสร้างอิมเมจ Docker เมื่อฉันอัปเดตเซิร์ฟเวอร์ฉันต้องการให้ผู้ใช้ทุกคนที่ใช้คอนเทนเนอร์ตามอิมเมจ Docker ของฉันสามารถอัปเกรดเป็นเซิร์ฟเวอร์ล่าสุดได้

โดยหลักการแล้วฉันต้องการสร้างอิมเมจ Docker รุ่นใหม่และมีคอนเทนเนอร์ทั้งหมดตามอิมเมจเวอร์ชันก่อนหน้านี้โดยอัตโนมัติอัปเดตเป็นอิมเมจใหม่ "แทนที่" แต่กลไกนี้ดูเหมือนจะไม่มีอยู่จริง

ดังนั้นการออกแบบที่ดีที่สุดต่อไปที่ฉันสามารถทำได้ในตอนนี้ก็คือการจัดหาวิธีการอัปเดตคอนเทนเนอร์เอง - คล้ายกับที่แอปพลิเคชันเดสก์ท็อปตรวจสอบการอัปเดตแล้วอัปเกรดตัวเอง ในกรณีของฉันนี่อาจหมายถึงการสร้างสคริปต์ที่เกี่ยวข้องกับ Git ที่ดึงมาจากแท็กที่รู้จักกันดี

รูปภาพ / คอนเทนเนอร์ไม่เปลี่ยนแปลงจริง ๆ แต่ "internals" ของการเปลี่ยนแปลงคอนเทนเนอร์นั้น คุณอาจจินตนาการว่าทำสิ่งเดียวกันกับ apt-get, yum หรืออะไรก็ตามที่เหมาะสมกับสภาพแวดล้อมของคุณ นอกจากนี้ฉันจะอัปเดต myserver: รูปภาพล่าสุดในรีจิสทรีเพื่อให้มีคอนเทนเนอร์ใหม่ใด ๆ ที่จะขึ้นอยู่กับภาพล่าสุด

ฉันสนใจที่จะฟังว่ามีงานศิลปะก่อนหน้านี้ที่ตอบสนองสถานการณ์นี้หรือไม่


7
มันขัดกับแนวคิดของโครงสร้างพื้นฐานที่ไม่เปลี่ยนแปลงและผลประโยชน์บางส่วน คุณสามารถทดสอบแอปพลิเคชัน / สภาพแวดล้อมของคุณเพื่อดูว่ามันใช้งานได้และไม่รับประกันว่าคุณจะอัปเดตส่วนประกอบภายใน การแยกรหัสคอนเทนเนอร์จากข้อมูลจากการกำหนดค่าช่วยให้คุณอัปเดตทดสอบว่าเรากำลังทำงานและปรับใช้กับการผลิตโดยรู้ว่าไม่มีรหัสบรรทัดที่แตกต่างจากภาพที่ทดสอบไปยังการผลิต อย่างไรก็ตามระบบจะให้คุณจัดการตามที่คุณพูดด้วยเช่นกันมันเป็นทางเลือกของคุณ
gmuslera

จุด gmuslera ดีมาก ยอมรับว่าเป็นรูปแบบต่อต้านการอัปเดต 'internals' ของตัวเทียบท่าที่มีอยู่
bjlevine

ดังนั้นทางออกที่ดีที่สุดในการอัปเดตคอนเทนเนอร์ของนักเทียบท่าอัตโนมัติโดยอิงตามการอัปเดตอิมเมจของนักเทียบท่าคือเพื่อส่งมอบการอัปเดตไปยังคอนเทนเนอร์ทั้งหมดได้อย่างง่ายดาย
tarek salem

1

ปรับปรุง

นี่คือการสอบถามภาชนะที่จะไม่ปรับปรุงเป็นหลักเนื่องจากการสร้างภาพเป็นวิธีที่จะทำ

ฉันมีปัญหาเดียวกันดังนั้นฉันจึงสร้างนักเรียกใช้งานซึ่งเป็นเครื่องมือบรรทัดคำสั่งที่ง่ายมากที่ทำงานภายในคอนเทนเนอร์นักเทียบท่าเพื่ออัปเดตแพ็กเกจในคอนเทนเนอร์ที่ใช้งานอื่น

มันใช้นักเทียบท่าเพื่อสื่อสารกับการทำงานภาชนะนักเทียบท่าและปรับปรุงแพคเกจหรือเรียกใช้คำสั่งใด ๆ โดยพลการ

ตัวอย่าง:

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

โดยค่าเริ่มต้นนี้จะเรียกใช้dateคำสั่งในคอนเทนเนอร์ที่ใช้งานอยู่ทั้งหมดและส่งคืนผลลัพธ์ แต่คุณสามารถออกคำสั่งใดก็ได้เช่นdocker-run exec "uname -a"

หากต้องการอัปเดตแพคเกจ (ปัจจุบันใช้ apt-get เท่านั้น):

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

คุณสามารถสร้างและนามแฝงและใช้มันเป็นบรรทัดคำสั่งปกติเช่น

alias docker-run='docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run'


นี่เป็นความคิดที่ดีหรือไม่? (ถ้าคุณทำapt update; apt upgradeรูปภาพจะเติบโต)
ctrl-alt-delor

@yaroslav's image เป็นทางออกที่ดีกว่าสำหรับปัญหานี้ ข้างต้นไม่ใช่วิธีการทำสิ่งที่นักเทียบท่าจริงๆ
Joost van der Laan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.