Saya memiliki aplikasi Python (2.7) yang dimulai di dockerfile saya:
CMD ["python","main.py"]
main.py mencetak beberapa string ketika dimulai dan masuk ke loop setelahnya:
print "App started"
while True:
time.sleep(1)
Selama saya memulai wadah dengan flag -it, semuanya berfungsi seperti yang diharapkan:
$ docker run --name=myapp -it myappimage
> App started
Dan saya bisa melihat output yang sama via log nanti:
$ docker logs myapp
> App started
Jika saya mencoba menjalankan wadah yang sama dengan flag -d, wadah tersebut tampaknya mulai dengan normal, tetapi saya tidak dapat melihat output apa pun:
$ docker run --name=myapp -d myappimage
> b82db1120fee5f92c80000f30f6bdc84e068bafa32738ab7adb47e641b19b4d1
$ docker logs myapp
$ (empty)
Tapi wadah itu tampaknya masih berjalan;
$ docker ps
Container Status ...
myapp up 4 minutes ...
Lampirkan juga tidak menampilkan apa pun:
$ docker attach --sig-proxy=false myapp
(working, no output)
Ada ide apa yang salah? Apakah "cetak" berperilaku berbeda ketika dijalankan di latar belakang?
Versi buruh pelabuhan:
Client version: 1.5.0
Client API version: 1.17
Go version (client): go1.4.2
Git commit (client): a8a31ef
OS/Arch (client): linux/arm
Server version: 1.5.0
Server API version: 1.17
Go version (server): go1.4.2
Git commit (server): a8a31ef
sumber
ENV PYTHONUNBUFFERED=0
jika-u
flag tidak berfungsi.-u
sini: stackoverflow.com/questions/107705/disable-output-bufferingDalam kasus saya, menjalankan Python dengan
-u
tidak mengubah apa pun. Apa triknya adalah menetapkanPYTHONUNBUFFERED=0
sebagai variabel lingkungan:sumber
-e PYTHONUNBUFFERED=0
bantuan.-u
. Solusi Anda memperbaikinya bagi saya di Docker untuk Mac dengan DjangoBagi saya itu adalah fitur, bukan bug. Tanpa pseudo-TTY tidak ada yang bisa dilakukan. Jadi solusi sederhana adalah dengan mengalokasikan pseudo-TTY untuk wadah Anda berjalan dengan:
sumber
tty: true
di tanah komposisiLihat artikel ini yang menjelaskan alasan detail perilaku tersebut:
Dan GNU libc (glibc) menggunakan aturan berikut untuk buffering:
Jadi, jika digunakan
-t
, dari dokumen buruh pelabuhan , itu akan mengalokasikan pseudo-tty, kemudianstdout
menjadiline-buffered
, sehinggadocker run --name=myapp -it myappimage
bisa melihat output satu baris.Dan, jika hanya digunakan
-d
, tidak ada tty dialokasikan, maka,stdout
adalahfully-buffered
, satu barisApp started
pasti tidak dapat menyiram buffer.Kemudian, gunakan
-dt
untukmake stdout line buffered
atau add-u
di python untukflush the buffer
adalah cara untuk memperbaikinya.sumber
Jika Anda ingin menambahkan output cetak Anda ke output Flask Anda saat menjalankan
docker-compose up
, tambahkan berikut ini ke file menulis docker Anda.https://docs.docker.com/compose/environment-variables/
sumber
Anda dapat melihat log pada gambar terpisah jika Anda mengubah
print
kelogging
.main.py:
Dockerfile:
sumber
Karena saya belum melihat jawaban ini:
Anda juga dapat menghapus stdout setelah Anda mencetaknya:
sumber
Coba tambahkan dua variabel lingkungan ini ke solusi Anda
PYTHONUNBUFFERED=1
danPYTHONIOENCODING=UTF-8
sumber
Sebagai perbaikan cepat, coba ini:
Ini bekerja untuk saya ketika saya menemukan masalah yang sama. Tapi, jujur saja, saya tidak tahu mengapa kesalahan ini terjadi.
sumber
Saya harus menggunakan
PYTHONUNBUFFERED=1
file docker-compose.yml saya untuk melihat output dari RunJver Django.sumber
Biasanya, kami mengarahkannya ke file tertentu (dengan memasang volume dari host dan menulisnya ke file itu).
Menambahkan tty menggunakan -t juga baik-baik saja. Anda harus mengambilnya di log buruh pelabuhan.
Menggunakan keluaran log yang besar, saya tidak memiliki masalah dengan penyangga menyimpan semua tanpa memasukkannya ke dalam log buruh pelabuhan.
sumber
Jika Anda tidak menggunakan
docker-compose
dan hanya normaldocker
, Anda dapat menambahkan ini ke AndaDockerfile
yang menjadi tuan rumah aplikasi labusumber