Sekadar pelengkap, saat menggunakan docker-compose , Anda juga dapat mencoba:
command: bash -c "script_or_command > /path/to/log/command.log 2>&1"
Saat Anda menentukan daftar JSON sebagai CMD
dalam Dockerfile
, itu tidak akan dieksekusi di shell, jadi fungsi shell yang biasa, seperti pengalihan stdout dan stderr, tidak akan berfungsi.
Dari dokumentasi:
Formulir exec diuraikan sebagai larik JSON, yang berarti Anda harus menggunakan tanda kutip ganda (
"
) di sekitar kata bukan tanda kutip tunggal ('
).Berbeda dengan bentuk shell, bentuk exec tidak menjalankan perintah shell. Ini berarti pemrosesan shell normal tidak terjadi. Misalnya,
CMD [ "echo", "$HOME" ]
tidak akan melakukan penggantian variabel pada$HOME
. Jika Anda ingin pemrosesan shell, gunakan formulir shell atau jalankan shell secara langsung, misalnya:CMD [ "sh", "-c", "echo", "$HOME" ]
.
Apa yang sebenarnya dilakukan oleh perintah Anda adalah mengeksekusi index.py
Anda skrip dan meneruskan string "1>server.log"
dan "2>server.log"
sebagai argumen baris perintah ke dalam skrip python itu .
Gunakan salah satu dari berikut ini (keduanya harus berfungsi):
CMD "python index.py > server.log 2>&1"
CMD ["/bin/sh", "-c", "python index.py > server.log 2>&1"]
Untuk menggunakan docker run
dalam pipa shell atau di bawah pengalihan shell, membuat run
terima stdin dan keluarkan ke stdout dan stderr dengan tepat, gunakan mantra ini:
docker run -i --log-driver=none -a stdin -a stdout -a stderr ...
misalnya untuk menjalankan alpine
gambar dan jalankan perintah UNIX cat
di lingkungan yang terkandung:
echo "This was piped into docker" |
docker run -i --log-driver=none -a stdin -a stdout -a stderr \
alpine cat - |
xargs echo This is coming out of docker:
memancarkan:
This is coming out of docker: This was piped into docker