ฉันมีปัญหาคล้ายกันในการใช้ระบบ Linux หลังจากบูตระบบแล้วคอนเทนเนอร์ที่มีนโยบายการรีสตาร์ทเป็น "เว้นแต่หยุด" จะไม่รีสตาร์ทโดยอัตโนมัติเว้นแต่ฉันจะพิมพ์คำสั่งที่ใช้นักเทียบท่าในทางใดทางหนึ่งเช่น "นักเทียบท่า ps" ฉันรู้สึกประหลาดใจเพราะฉันคาดว่าคำสั่งนั้นจะรายงานข้อมูลสถานะบางอย่างเท่านั้น ต่อไปฉันลองใช้คำสั่ง "systemctl status docker" บนระบบที่ไม่มีการรันคำสั่ง docker คำสั่งนี้รายงานสิ่งต่อไปนี้:
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)
Active: inactive (dead) TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
ในระบบที่เรียกใช้ "docker ps" โดยไม่มีคำสั่ง Docker อื่น ๆ ฉันได้รับสิ่งต่อไปนี้:
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)
Active: active (running) since Sun 2020-11-22 08:33:23 PST; 1h 25min ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 3135 (dockerd)
Tasks: 13
Memory: 116.9M
CGroup: /system.slice/docker.service
└─3135 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
... [various messages not shown ]
คำอธิบายที่เป็นไปได้มากที่สุดคือ Docker รอคำสั่ง docker ก่อนที่จะเริ่มต้นและเริ่มคอนเทนเนอร์อย่างสมบูรณ์ คุณสามารถเรียกใช้ "docker ps" ในไฟล์ systemd unit ได้ทีละจุดหลังจากเริ่มต้นบริการทั้งหมดที่คอนเทนเนอร์ของคุณต้องการแล้ว ฉันได้ทดสอบสิ่งนี้โดยใส่ไฟล์ชื่อ docker-onboot.service ในไดเร็กทอรี / lib / systemd / system พร้อมเนื้อหาต่อไปนี้:
[Unit]
# This service is provided to force Docker containers
# that should automatically restart to restart when the system
# is booted. While the Docker daemon will start automatically,
# it will not be fully initialized until some Docker command
# is actually run. This unit merely runs "docker ps": any
# Docker command will result in the Docker daemon completing
# its initialization, at which point all containers that can be
# automatically restarted after booting will be restarted.
#
Description=Docker-Container Startup on Boot
Requires=docker.socket
After=docker.socket network-online.target containerd.service
[Service]
Type=oneshot
ExecStart=/usr/bin/docker ps
[Install]
WantedBy = multi-user.target
จนถึงตอนนี้ (การทดสอบหนึ่งครั้งโดยเปิดใช้บริการนี้) คอนเทนเนอร์เริ่มต้นเมื่อคอมพิวเตอร์บูต ฉันไม่ได้ลองพึ่งพา docker.service เนื่องจาก docker.service จะไม่เริ่มทำงานจนกว่าจะมีการเรียกใช้คำสั่ง docker การทดสอบครั้งต่อไปจะเป็นการปิดการใช้งาน docker-onboot (เพื่อดูว่าการพึ่งพา WantedBy จะเริ่มโดยอัตโนมัติหรือไม่)
Systemd
เป็นผู้จัดการบริการเป็นหนึ่งในโซลูชั่นที่ดีที่สุดสำหรับวัตถุประสงค์ที่ต้องการและ upvotes เพิ่มเติม