Saya ingin memulai layanan dengan docker-compose dan menjaga container tetap berjalan sehingga saya bisa mendapatkan alamat IP-nya melalui 'docker inspect'. Namun, kontainer selalu keluar segera setelah dinyalakan.
Saya mencoba menambahkan "perintah: [" tidur "," 60 "]" dan hal-hal lain ke docker-compose.yml tetapi setiap kali saya menambahkan baris dengan "perintah: ..." Saya tidak bisa memanggil "docker-compose up" karena saya akan mendapatkan pesan "Tidak dapat memulai penampung ..... Kesalahan sistem: karakter tidak valid 'k' mencari awal nilai"
Saya juga mencoba menambahkan "CMD sleep 60" dan yang lainnya ke Dockerfile itu sendiri tetapi perintah ini sepertinya tidak dijalankan.
Adakah cara mudah untuk menjaga agar wadah tetap hidup atau untuk memperbaiki salah satu masalah saya?
EDIT: Ini file Tulis yang ingin saya jalankan:
version: '2'
services:
my-test:
image: ubuntu
command: bash -c "while true; do echo hello; sleep 2; done"
Ini berfungsi dengan baik Jika saya memulai ini dengan docker-compose di bawah OS X, tetapi jika saya mencoba hal yang sama di Ubuntu 16.04 itu memberi saya pesan kesalahan di atas.
Jika saya mencoba pendekatan dengan Dockerfile, Dockerfile akan terlihat seperti ini:
FROM ubuntu:latest
CMD ["sleep", "60"]
Yang sepertinya tidak melakukan apa-apa
EDIT 2: Saya harus mengoreksi diri sendiri, ternyata masalahnya sama dengan Dockerfile dan docker-compose.yml: Setiap kali saya menambahkan "CMD ..." ke Dockerfile ATAU tambahkan "perintah ..." ke file tulis, saya mendapatkan kesalahan di atas dengan karakter tidak valid. Jika saya menghapus kedua perintah, ini bekerja dengan sempurna.
sumber
Jawaban:
Agar container tetap berjalan saat Anda memulainya
docker-compose
, gunakan perintah berikutcommand: tail -F anything
Jadi buruh pelabuhan-compose.yml Anda menjadi
dan Anda dapat menjalankan shell untuk masuk ke dalam container menggunakan perintah berikut
docker exec -i -t composename_my-test_1 bash
di mana
composename
nama yangdocker-compose
ada di awal penampung Anda.sumber
exit
untuk kembali ke mesin host Anda. Jika Anda menggunakan host Anda, maka Anda dapat menghentikan container menggunakan Docker (docker stop composename_my-test_1
) atau Docker Compose (docker-compose stop
)./dev/null
akan lebih baik di tempat untukanything
perintah ekor ref. stackoverflow.com/a/48732671/248616Anda dapat menggunakan
tty
opsi konfigurasi.Catatan: Jika Anda menggunakan Dockerfile untuk image dan
CMD
di Dockerfile, opsi ini tidak akan berfungsi; namun, Anda dapat menggunakanentrypoint
opsi di file compose yang membersihkanCMD
dari Dockerfile.sumber
tail -f /dev/null
. Dengan ini, saya dapat menjalankan lingkungan dev dalam container dengan database postgres yang terpasang melaluidocker-compose up
dan menjalankan shell melalui terminal lain menggunakandocker exec
.tail -f /dev/null
atautail -f anything
, lihat di sini: docs.docker.com/compose/compose-fileBerdasarkan komentar dari Gaanub di Gub, 26 Agustus 2015 , seseorang dapat menggunakan
tail -f /dev/null
dalam pembuatan galangan untuk menjaga agar kontainer tetap berjalan.contoh docker-compose.yml
Mengapa perintah ini?
Satu-satunya alasan untuk memilih opsi ini adalah karena opsi ini mendapat banyak jempol di GitHub, tetapi jawaban dengan suara terbanyak tidak berarti ini adalah jawaban terbaik. Alasan kedua adalah alasan pragmatis karena masalah harus diselesaikan secepat mungkin karena tenggat waktu.
sumber
docker-compose.yml
docker-compose up -d
dari terminaldocker ps
untuk mendapatkan id atau nama penampungdocker inspect $container_id
docker-compose exec ubuntu /bin/bash
ataudocker-compose exec ubuntu /bin/sh
docker-compose down
Berikut ini skrip bash kecil (
my-docker-shell.sh
) untuk membuat file penulisan buruh pelabuhan, menjalankan penampung, masuk ke penampung dan kemudian membersihkan penampung buruh pelabuhan dan file tulis buruh pelabuhan saat Anda keluar.#!/bin/bash cat << 'EOF' > ./docker-compose.yml --- version: "3" services: ubuntu: image: ubuntu:latest command: /bin/bash # tty: true ... EOF printf "Now entering the container...\n" docker-compose run ubuntu bash docker-compose down rm -v ./docker-compose.yml
sumber
Di Dockerfile Anda dapat menggunakan perintah:
sumber
Seperti yang dinyatakan oleh pemberi komentar, kami harus melihat Dockerfile yang dimaksud untuk memberi Anda jawaban lengkap, tetapi ini adalah kesalahan yang sangat umum. Saya dapat menjamin cukup banyak bahwa perintah yang Anda coba jalankan memulai proses latar belakang. Ini mungkin perintah yang Anda jalankan dalam situasi non-Docker, tetapi itu adalah hal yang salah untuk dilakukan di Dockerfile. Misalnya, jika apa yang Anda jalankan biasanya ditetapkan sebagai layanan sistem, Anda mungkin menggunakan sesuatu seperti "systemctl start". Itu akan memulai proses di latar belakang, yang tidak akan berfungsi. Anda harus menjalankan proses di latar depan, sehingga seluruh proses akan diblokir.
sumber
Hanya catatan singkat
Saya telah menguji satu gambar berdasarkan
golang
, jadi ketika saya menelepon didocker-compose down
sini apa yang saya dapatkan:Info sistem saya:
sumber
Oke saya menemukan kesalahan saya. Di Dockerfile untuk gambar yang digunakan untuk menulis, saya menentukan bahwa gambar dasar harus ubuntu: terbaru, tetapi saya sebelumnya membuat gambar yang disebut ubuntu sendiri dan gambar itu tidak berfungsi. Jadi saya tidak menggunakan gambar ubuntu asli melainkan versi rusak dari gambar saya sendiri yang juga disebut ubuntu.
sumber