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