วิธีเรียกใช้ Docker-compose up -d เมื่อเริ่มระบบ


115

เพื่อให้คอนเทนเนอร์เริ่มต้นโดยอัตโนมัติที่จุดเริ่มต้นฉันพยายามเพิ่มคำสั่ง:

cd directory_has_docker-compose.yml && docker-compose up -d ใน /etc/rc.local

แต่หลังจากที่ฉันรีบูตเครื่องตู้คอนเทนเนอร์ก็ไม่ทำงาน

วิธีการทำงานdocker-compose up -dในระบบเริ่มต้นได้อย่างไร


3
ใช้--restart alwaysหรือ--restart unless-stoppedหรือใน docker-compose.yml use restart: always-> Ref . แต่อาจจะใช้ไม่ได้กับบางคอนเทนเนอร์!
Benyamin Jafari

คำตอบ:


138

เมื่อเราใช้crontabหรือ/etc/rc.localไฟล์ที่เลิกใช้งานเราจำเป็นต้องมีการหน่วงเวลา (เช่นsleep 10ขึ้นอยู่กับเครื่อง) เพื่อให้แน่ใจว่ามีบริการระบบ โดยปกติแล้วsystemd(หรือupstart) จะใช้เพื่อจัดการว่าบริการใดเริ่มทำงานเมื่อระบบบู๊ต คุณสามารถลองใช้การกำหนดค่าที่คล้ายกันสำหรับสิ่งนี้:

# /etc/systemd/system/docker-compose-app.service

[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/srv/docker
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

หรือหากคุณต้องการรันโดยไม่มี-dแฟล็ก:

# /etc/systemd/system/docker-compose-app.service

[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
WorkingDirectory=/srv/docker
ExecStart=/usr/local/bin/docker-compose up
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0
Restart=on-failure
StartLimitIntervalSec=60
StartLimitBurst=3

[Install]
WantedBy=multi-user.target

เปลี่ยนWorkingDirectoryพารามิเตอร์ด้วยพา ธ โปรเจ็กต์ dockerized ของคุณ และเปิดใช้งานบริการเพื่อเริ่มโดยอัตโนมัติ:

systemctl enable docker-compose-app

มีวิธีง่ายๆในการทดสอบว่าใช้งานได้โดยไม่ต้องรีสตาร์ทราสเบอร์รี่หรือไม่?
dmigo

3
นี่คือคำตอบที่สง่างามที่สุด IMO
kuzyn

2
@dmigo systemctl start docker-compose-appและsystemctl status docker-compose-appฉันคิดว่าสิ่งที่คุณกำลังมองหา
HectorJ

ไม่ได้ผลสำหรับฉันเมื่อฉันsystemctl start docker-compose-appพบกับสิ่งนี้:Job for docker-compose-app.service failed because the control process exited with error code. See "systemctl status docker-compose-app.service" and "journalctl -xe" for details
Benyamin Jafari

1
@dmigo: ทดสอบการเริ่มต้นบริการของคุณด้วย: service docker-compose-app startสถานะกับservice docker-compose-app statusหยุดด้วยservice docker-compose-app stop
BarryPye

96

คุณควรจะสามารถเพิ่ม:

restart: always 

กับทุกบริการที่คุณต้องการเริ่มต้นใหม่ในไฟล์ docker-compose.yml


6
โปรดทราบว่าพวกเขาจะต้องทำงานเมื่อเกิดการรีบูตดังนั้นอย่าหยุดด้วยตนเองก่อนที่จะรีบูต
ทอม

บริการบางอย่างเช่น Nginx ไม่ได้เริ่มต้นด้วยตัวเลือกนี้ด้วยซ้ำ
Benyamin Jafari

15
นี่คือคำตอบที่เหมาะสมสำหรับคำถาม มีวิธีที่ออกแบบมาเพื่อรีสตาร์ทคอนเทนเนอร์ทำไมต้องเข้าสู่งาน cron และวิธีอื่น ๆ ในการสร้างล้อใหม่
Taha Rehman Siddiqui

นี่คือคำตอบที่ใช่ เมื่อคุณเริ่มใช้ Kubernetes แทน cron คุณจะพอใจที่ใช้มัน
pferrel

9
@TahaRehmanSiddiqui หมายเหตุที่restart: alwaysมีข้อบกพร่องร้ายแรงบางอย่าง: การติดตั้งโฮสต์จะไม่ถูกแนบมาในการรีบูตเช่น ในความคิดของฉันการสร้างล้อใหม่จะดีกว่าถ้าล้อที่มีอยู่เป็นสี่เหลี่ยม
okdewit

74

หากคุณdocker.serviceเปิดใช้งานเมื่อเริ่มต้นระบบ

$ sudo systemctl enable docker

และบริการของคุณที่คุณdocker-compose.ymlมี

restart: always

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

docker-compose up -d

2
นี่น่าจะเป็นทางออกที่ดีที่สุด
Carl Cheung

ทำไม "เริ่มต้นใหม่: เสมอ" และไม่ "เริ่มต้นใหม่: เว้นแต่หยุด" ทั้งสองควรทำงานที่ฉันจะพูด
rastov

1
@rastov ทั้งสองเหมือนกัน แต่ไม่หยุดเมื่อคอนเทนเนอร์หยุดทำงาน (ด้วยตนเองหรืออย่างอื่น) จะไม่รีสตาร์ทแม้ว่า Docker daemon จะรีสตาร์ท
masoud vatandoost

35

ฉันลองrestart: alwaysแล้วมันใช้งานได้กับบางคอนเทนเนอร์ (เช่น php-fpm) แต่ฉันประสบปัญหาที่บางคอนเทนเนอร์ (เช่น nginx) ยังไม่รีสตาร์ทหลังจากรีบูต

แก้ไขปัญหา

crontab -e

@reboot (sleep 30s ; cd directory_has_dockercomposeyml ; /usr/local/bin/docker-compose up -d )&

2
ทำไมจึงโหวตให้คำตอบนี้ คำตอบไม่มีประโยชน์? ผิดในแง่ใด? ความคิดเห็นจะเป็นประโยชน์ในการบอกให้ผู้ตอบและคนอื่นรู้ว่ามีอะไรผิดพลาด
อยุธยา

5
คุณควรสงสัยว่าจะนอนเปล่า ๆ เพราะพวกเขาแนะนำพฤติกรรมที่ไม่ได้กำหนด: martinfowler.com/articles/…
giorgiosironi

@giorgiosironi การนอนหลับเป็นเรื่องปกติในกรณีนี้ การเริ่มต้นใช้งานคอนเทนเนอร์ต้องสามารถจัดการกับพฤติกรรมที่ไม่เป็นไปตามข้อกำหนดได้อยู่ดี
z0r

4
นอกจากนี้ยังแนะนำเวลาในการตอบสนองสูงสุด 30 วินาทีซึ่งอาจไม่จำเป็น
giorgiosironi

@ z0r นอนไม่สบาย! การนอนหลับอาจ "ทำงาน" แต่ลำดับการเริ่มต้นใด ๆ ควรถูกกำหนด บริการ Linux ใช้การอ้างอิงเพื่อให้แน่ใจว่าสิ่งต่างๆเช่นเครือข่ายพร้อมใช้งานเป็นต้นก่อนที่จะเริ่ม คุณควรทำเช่นเดียวกัน
colm.anseo

25

ใช้รีสตาร์ท: เสมอในไฟล์นักเทียบท่าเขียนของคุณ

Docker-compose up -dจะเปิดคอนเทนเนอร์จากรูปภาพอีกครั้ง ใช้docker-compose startเพื่อเริ่มคอนเทนเนอร์ที่หยุดทำงานโดยจะไม่เปิดตัวคอนเทนเนอร์ใหม่จากรูปภาพ

nginx:   
    restart: always   
    image: nginx   
    ports:
      - "80:80"
      - "443:443"   links:
      - other_container:other_container

นอกจากนี้คุณสามารถเขียนโค้ดในไฟล์นักเทียบท่าเพื่อให้สร้างขึ้นก่อนหากมีการพึ่งพาคอนเทนเนอร์อื่น ๆ


2
คุณอาจไม่ต้องการที่จะใช้แต่บางทีalways unless-stoppedตัวเลือกอื่น ๆ คือon-failureและno. นี้เป็นที่รู้จักกันว่าเป็นนโยบายการรีสตาร์ท
พอล

5

นอกเหนือจากuser39544คำตอบแล้วยังมีไวยากรณ์อีกประเภทหนึ่งสำหรับcrontab -e:

@reboot sleep 60 && /usr/local/bin/docker-compose -f /path_to_your_project/docker-compose.yml up -d

สิ่งนี้ใช้ได้ผลสำหรับฉันในเดือนมีนาคม 2018 บน RPi3 ที่รัน Raspian ฉันทำงานcrontab -eในฐานะผู้ใช้ pi โดยมี pi เป็นสมาชิกของกลุ่มนักเทียบท่า ...
Scott Veirs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.