เริ่มต้นนักเทียบท่าเขียนด้วย systemd บน Ubuntu 15.04


10

ฉันมีโปรเจ็กต์นักเทียบท่าที่ฉันต้องการควบคุมผ่าน systemd โดยทั่วไปฉันจะใช้สคริปต์ที่มีลักษณะดังนี้:

description "Start/Stop server"
author "Jim Cortez"

start on filesystem and started docker
stop on runlevel [!2345]

respawn limit 3 240

pre-start script
    # wait (if necessary) for our docker context to be accessible
    while [ ! -f /projects/my_server/docker-compose.yml ]
    do
      sleep 1
    done
    /usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml up -d
end script

script
    sleepWhileAppIsUp(){
        while docker ps | grep "$1" >/dev/null; do
            sleep 2
        done
    }

    sleepWhileAppIsUp "my_server"
end script

# stop docker container after the stop event has completed
post-stop script
    if docker ps | grep my_server;
    then
        /usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml stop
    fi
end script

(ด้านบนดัดแปลงมาจากที่นี่ )

อย่างไรก็ตามตอนนี้ฉันทำงานบนโฮสต์นักเทียบท่าที่รัน Ubuntu 15.04 ซึ่งเปลี่ยนไปเป็น systemd ฉันจะทำข้างต้นเป็นสคริปต์บริการ systemd ได้อย่างไร เพียงแค่เรียกใช้ daemon-compose daemon จะไม่อนุญาตให้ systemd ติดตามและรีสตาร์ทในกรณีที่เกิดความล้มเหลว

นี่คือสิ่งที่ฉันมีจนถึงตอนนี้:

[Unit]
Description=My Server container
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStart=/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml up -d
ExecStop=/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml stop

[Install]
WantedBy=local.target

คำตอบ:


11

ฉันขอแนะนำให้ลบ-dตัวเลือก คุณไม่จำเป็นต้องเรียกใช้คอนเทนเนอร์ในพื้นหลังในกรณีนี้


6

ผมพบว่าผู้เขียนใช้วิธีการที่คล้ายกับที่คุณhttp://trackless.ca/2015/12/21/docker-compose-meets-systemd/ แต่เขายังสร้างบริการ systemd หนึ่งบริการสำหรับแต่ละบริการนักเทียบท่า

คุณอาจพิจารณาที่จะแปลงไฟล์นักเทียบท่าของคุณเป็นไฟล์บริการ systemd หลายไฟล์เพื่อกำจัดการพึ่งพานักเขียน - นักเทียบท่า: http://container-transform.readthedocs.org/ ฉันใช้วิธีการนี้ทำงานได้ดีสำหรับการตั้งค่าแบบง่าย


1
คุณอาจต้องการใส่ข้อมูลเพิ่มเติมจากลิงก์ในคำตอบของคุณลิงก์มักจะไม่ทำงานหลังจากเวลาผ่านไป
Dennis Nolte

1
แน่นอนลิงค์ไม่ทำงานอีกต่อไป ^^
christophe31

นี่คือลิงค์เก็บถาวรทางอินเทอร์เน็ตไปยังโพสต์บล็อกแรก: web.archive.org/web/20161105135126/http://trackless.ca/2015/12//
pdoherty926

0

ลองนี้ฉันพบในการทดสอบของฉันมันต้องใช้เวลามากกว่าบริการปกติเพื่อเริ่มหรือหยุด

[Unit]
Description=My Server container
Requires=docker.service
After=network.target docker.service

[Service]
#Restart=always
Type=simple
WorkingDirectory=/projects/my_server
ExecStart=/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /projects/my_server/docker-compose.yml down

[Install]
WantedBy=multi-user.target

1
ฉันคิดว่าคุณควรใช้ WorkingDirectory เขียนนักเทียบท่าใช้ไดเรกทอรีการทำงานปัจจุบันเพื่อโหลดไฟล์. env WorkingDirectory = / projects / my_server และ ExecStart = / usr / local / bin / docker-compose
Mohammadalijf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.