Saya ingin melakukan sesuatu seperti ini di mana saya dapat menjalankan beberapa perintah secara berurutan.
db:
image: postgres
web:
build: .
command: python manage.py migrate
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
docker
yaml
docker-compose
RustyShackleford
sumber
sumber
/bin/bash
sh
sebagai gantinya:[sh, -c, "cd /usr/src/app && npm start"]
ash
di alpine :)Saya menjalankan hal-hal pra-mulai seperti migrasi dalam wadah singkat yang terpisah, seperti itu (catatan, file penulisan harus bertipe versi '2'):
Ini membantu menjaga kebersihan dan terpisah. Dua hal yang perlu dipertimbangkan:
Anda harus memastikan urutan startup yang benar (menggunakan depend_on)
Anda ingin menghindari beberapa build yang dicapai dengan memberi tag pada putaran pertama kali menggunakan build dan gambar; Anda dapat merujuk gambar di wadah lain itu
sumber
bash -c
atas.Saya sarankan menggunakan
sh
sebagai kebalikan daribash
karena lebih mudah tersedia pada sebagian besar gambar berbasis unix (alpine, dll).Berikut ini sebuah contoh
docker-compose.yml
:Ini akan memanggil perintah berikut secara berurutan:
python manage.py wait_for_db
- tunggu db siappython manage.py migrate
- jalankan migrasi apa punpython manage.py runserver 0.0.0.0:8000
- mulai server pengembangan sayasumber
>
digunakan untuk memulai input multi-line (lihat stackoverflow.com/a/3790497/2220370 )Ini bekerja untuk saya:
docker-compose mencoba melakukan dereferensi variabel sebelum menjalankan perintah, jadi jika Anda ingin bash untuk menangani variabel, Anda harus lolos dari tanda dolar dengan menggandakannya ...
... kalau tidak Anda akan mendapatkan kesalahan:
sumber
$${Types}
dan$${Client}
. Saya pikir ini akan mencegah pembuat galangan dari menafsirkan variabel-variabel tersebut dan mencari nilai-nilai mereka di shell apa pun yang Anda gunakan dari pembuat galangan, yang akan berarti bahwa mereka masih ada untuk bash untuk mereferensikan mereka ( setelah buruh pelabuhan memproses.env
file Anda ).Anda dapat menggunakan titik masuk di sini. entrypoint di docker dieksekusi sebelum perintah sedangkan perintah adalah perintah default yang harus dijalankan ketika kontainer mulai. Jadi sebagian besar aplikasi umumnya menjalankan prosedur pengaturan dalam file entrypoint dan pada akhirnya mereka mengizinkan perintah untuk dijalankan.
membuat file skrip shell mungkin sebagai
docker-entrypoint.sh
(nama tidak masalah) dengan konten berikut di dalamnya.dalam file docker-compose.yml gunakan dengan
entrypoint: /docker-entrypoint.sh
dan daftarkan perintah sebagaicommand: python manage.py runserver 0.0.0.0:8000
PS: jangan lupa menyalindocker-entrypoint.sh
bersama dengan kode Anda.sumber
docker-compose run service-name ....
Ide lain:
Jika, seperti dalam kasus ini, Anda membangun wadah hanya tempat skrip startup di dalamnya dan jalankan ini dengan perintah. Atau pasang skrip startup sebagai volume.
sumber
#!/bin/bash \n python manage.py migrate \n python manage.py runserver 0.0.0.0:8000
(onlin jelek)* PEMBARUAN *
Saya pikir cara terbaik untuk menjalankan beberapa perintah adalah dengan menulis Dockerfile kustom yang melakukan semua yang saya inginkan sebelum CMD resmi dijalankan dari gambar.
docker-compose.yaml:
Dockerfile.mongo:
Ini mungkin cara paling bersih untuk melakukannya.
* CARA LAMA *
Saya membuat skrip shell dengan perintah saya. Dalam hal ini saya ingin memulai
mongod
, dan menjalankanmongoimport
tetapi memanggilmongod
blok Anda dari menjalankan sisanya.docker-compose.yaml :
start_mongod.sh :
Jadi ini garpu mongo, melakukan monogimport dan kemudian membunuh mongo bercabang yang terlepas, dan memulai lagi tanpa melepaskan. Tidak yakin apakah ada cara untuk melampirkan proses bercabang tapi ini berhasil.
CATATAN: Jika Anda benar-benar ingin memuat beberapa data db awal, ini adalah cara untuk melakukannya:
mongo_import.sh
file mongo_fixtures / *. json dibuat melalui perintah mongoexport.
docker-compose.yaml
sumber
Jika Anda perlu menjalankan lebih dari satu proses daemon, ada saran dalam dokumentasi Docker untuk menggunakan Supervisord dalam mode un-detached sehingga semua sub-daemon akan menghasilkan keluaran ke stdout.
Dari pertanyaan SO lainnya, saya menemukan Anda dapat mengarahkan output proses anak ke stdout. Dengan begitu Anda bisa melihat semua output!
sumber
Untuk menjalankan banyak perintah dalam file pembuatan docker dengan menggunakan
bash -c
.Sumber: https://intellipaat.com/community/19590/docker-run-multiple-commands-using-docker-compose-at-once?show=19597#a19597
sumber
Gunakan alat seperti menunggu atau meroserisasi . Ini adalah skrip pembungkus kecil yang dapat Anda sertakan dalam gambar aplikasi Anda. Atau tulis skrip pembungkus Anda sendiri untuk melakukan perintah aplikasi yang lebih spesifik. menurut: https://docs.docker.com/compose/startup-order/
sumber
Saya berlari ke ini ketika mencoba untuk mengatur wadah jenkins saya untuk membangun wadah buruh pelabuhan sebagai pengguna jenkins.
Saya perlu menyentuh file docker.sock di Dockerfile ketika saya menautkannya nanti di file menulis-docker. Kecuali saya menyentuhnya terlebih dahulu, itu belum ada. Ini berhasil untuk saya.
Dockerfile:
docker-compose.yml:
sumber
coba gunakan ";" untuk memisahkan perintah jika Anda berada di verions dua misalnya
command: "sleep 20; echo 'a'"
sumber