Bagaimana cara menjalankan docker-compose up -d saat sistem mulai?

115

Untuk membiarkan kontainer mulai otomatis pada titik startup, saya mencoba menambahkan perintah:

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

tetapi kemudian setelah saya mem-boot ulang mesin, kontainer tidak berfungsi.

Bagaimana dijalankan docker-compose up -dsaat sistem dimulai?

pengguna39544
sumber
3
gunakan --restart alwaysatau --restart unless-stoppedatau dalam penggunaan docker-compose.yml restart: always-> Ref . Tapi mungkin tidak bekerja pada beberapa wadah!
Benyamin Jafari

Jawaban:

132

Saat kami menggunakan crontabatau /etc/rc.localfile yang tidak digunakan lagi , kami memerlukan penundaan (misalnya sleep 10, bergantung pada mesin) untuk memastikan bahwa layanan sistem tersedia. Biasanya, systemd(atau upstart) digunakan untuk mengelola layanan mana yang dimulai saat sistem melakukan booting. Anda dapat mencoba menggunakan konfigurasi serupa untuk ini:

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

Atau, jika Anda ingin berjalan tanpa -dbendera:

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

Ubah WorkingDirectoryparameter dengan jalur proyek docker Anda. Dan aktifkan layanan untuk dimulai secara otomatis:

systemctl enable docker-compose-app
Oleg Belostotsky
sumber
Apakah ada cara sederhana untuk menguji apakah itu berfungsi tanpa memulai ulang raspberry?
dmigo
2
Ini adalah jawaban IMO paling elegan
kuzyn
2
@dmigo systemctl start docker-compose-appdan systemctl status docker-compose-appsaya pikir apa yang Anda cari.
HectorJ
tidak berhasil untuk saya, ketika saya menjalankan systemctl start docker-compose-appditemui ini: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: uji startup layanan Anda dengan service docker-compose-app startservice docker-compose-app statusservice docker-compose-app stop
:,
96

Anda harus bisa menambahkan:

restart: always 

ke setiap layanan yang ingin Anda restart di file docker-compose.yml

MaxiReglisse
sumber
6
Perlu diingat bahwa mereka harus berjalan saat reboot terjadi, jadi jangan hentikan secara manual sebelum reboot.
Tom
beberapa layanan seperti Nginx bahkan tidak dimulai dengan opsi ini.
Benyamin Jafari
15
Ini adalah jawaban yang tepat untuk pertanyaan itu. Ada cara yang dirancang untuk memulai kembali kontainer, mengapa masuk ke pekerjaan cron dan cara lain untuk menemukan kembali roda.
Taha Rehman Siddiqui
Ini adalah jawaban yang benar. Saat Anda mulai menggunakan Kubernetes, bukan cron, Anda akan senang menggunakannya.
pferrel
9
@TahaRehmanSiddiqui Catatan yang restart: alwaysmemiliki beberapa bug serius: mount host tidak akan dipasang saat reboot misalnya. Menurut saya, lebih baik menemukan kembali roda, jika roda yang ada berbentuk persegi.
okdewit
73

Jika Anda docker.servicediaktifkan pada startup sistem

$ sudo systemctl enable docker

dan layanan Anda di docker-compose.ymlmiliki Anda

restart: always

semua layanan berjalan ketika Anda me-reboot sistem Anda jika Anda menjalankan perintah di bawah ini hanya sekali

docker-compose up -d
masoud vatandoost
sumber
2
ini harus menjadi solusi yang paling elegan
Carl Cheung
34

Saya mencoba restart: always, ini berfungsi di beberapa wadah (seperti php-fpm), tetapi saya menghadapi masalah bahwa beberapa wadah (seperti nginx) masih tidak memulai ulang setelah reboot.

Memecahkan masalah.

crontab -e

@reboot (sleep 30s ; cd directory_has_dockercomposeyml ; /usr/local/bin/docker-compose up -d )&
pengguna39544
sumber
2
Mengapa suara negatif untuk jawaban ini? Apakah jawabannya tidak berguna? Apakah itu salah? Sebuah komentar akan berguna untuk memberi tahu penjawab dan orang lain apa yang salah.
Ayushya
5
Anda harus mencurigai adanya tidur telanjang karena hal itu memperkenalkan perilaku non-deterministik: martinfowler.com/articles/…
giorgiosironi
@giorgiosironi tidur baik-baik saja dalam kasus ini. Permulaan kontainer harus mampu menangani perilaku nondeterministik.
z0r
4
Ini juga memperkenalkan latensi hingga 30 detik yang mungkin tidak diperlukan.
giorgiosironi
@ z0r tidur tidak baik! Tidur mungkin "bekerja" tetapi urutan startup harus bersifat deterministik. Layanan Linux menggunakan dependensi untuk memastikan hal-hal seperti jaringan tersedia, dll. Sebelum dimulai. Anda harus melakukan hal yang sama.
colm.anseo
25

Gunakan restart: selalu di file tulis buruh pelabuhan Anda.

Docker-compose up -dakan meluncurkan kontainer dari gambar lagi. Gunakan docker-compose startuntuk memulai penampung yang dihentikan, ia tidak pernah meluncurkan penampung baru dari gambar.

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

Anda juga dapat menulis kode di file buruh pelabuhan sehingga dibuat pertama kali, jika memiliki ketergantungan penampung lain.

Vaseem007
sumber
1
Anda mungkin tidak ingin menggunakan always, tapi mungkin unless-stopped. Pilihan lainnya adalah on-failuredan no. Ini dikenal sebagai kebijakan mulai ulang .
Paul
5

Sebagai tambahan user39544jawaban, satu lagi jenis sintaks untuk crontab -e:

@reboot sleep 60 && /usr/local/bin/docker-compose -f /path_to_your_project/docker-compose.yml up -d
TitanFighter
sumber
Ini berhasil untuk saya pada Maret 2018 dengan RPi3 yang menjalankan Raspian. Saya menjalankan crontab -esebagai pengguna pi, dengan pi anggota dari buruh pelabuhan kelompok ...
Scott Veirs