Limandaki komut çıktısının yönlendirilmesi


5

Docker kapsayıcısında çalışan küçük bir Flask uygulaması olan sunucum için basit bir kayıt yapmak istiyorum.

İşte Dockerfile

# Dockerfile
FROM dreen/flask
MAINTAINER dreen
WORKDIR /srv

# Get source
RUN mkdir -p /srv
COPY perfektimprezy.tar.gz /srv/perfektimprezy.tar.gz
RUN tar x -f perfektimprezy.tar.gz
RUN rm perfektimprezy.tar.gz

# Run server
EXPOSE 80
CMD ["python", "index.py", "1>server.log", "2>server.log"]

Son satırda görebileceğiniz gibi stderr ve stdout'u bir dosyaya yönlendiririm. Şimdi bu kabı ve kabuğunu çalıştırıyorum.

docker run -d -p 80:80 perfektimprezy
docker exec -it "... id of container ..." bash

Ve aşağıdakileri gözlemleyin:

Sunucu çalışıyor ve web sitesi çalışıyor

Yok /srv/server.log

ps aux | grep python verim:

root         1  1.6  3.2  54172 16240 ?        Ss   13:43   0:00 python index.py 1>server.log 2>server.log
root        12  1.9  3.3 130388 16740 ?        Sl   13:43   0:00 /usr/bin/python index.py 1>server.log 2>server.log
root        32  0.0  0.0   8860   388 ?        R+   13:43   0:00 grep --color=auto python

Ama hiçbir kayıt yok ... NASIL, eğer ben docker attach konteyner için ben uygulama üreten çıktı konsolda görebilirsiniz.

Docker kullanırken stdout / err dosyasını bir dosyaya nasıl düzgün bir şekilde yönlendiririm?

Yanıtlar:


4

Kullanım durumunuzu sorgulamak istiyorum. Stderr / stdout komutunu kaptaki bir günlük dosyasına neden yeniden yönlendirmeniz gerekiyor? Birleştirilmiş stderr ve stdout, "docker günlükleri" kullanılarak kabın dışında kullanılabilir ve bir dosyaya (kabın dışında) yönlendirilebilir. Daha fazla ayrıntı bulunabilir İşte


haklısın, yapamıyorum bile yapamıyorum docker logs ID > stdout.log 2>stdout.log ama hala bir istisna göremiyorum ... hatasız bir şekilde öleceğini düşünmeye başlıyorum
Dreen

1
İşte bir kullanım durumu: Kapsayıcıyı Docker Cloud'da çalıştırıyorsunuz (günlük çıktısını yalnızca (uzak ve kolay erişilemeyen) düğümdeki bir dosyaya yeniden yönlendiremezsiniz. Çok sayıda farklı başsız kap çalıştırıyorsunuz ve istediğiniz İlgili çıktıları (muhtemelen gigabayt veri) birkaç saat sonra toplamak.
hheimbuerger

@hheimbuerger "Neden stderr / stdout komutunu konteynerdeki bir günlük dosyasına yönlendirmeniz gerekiyor?" Kullanım durum tanımlamanıza rağmen, günlük kullanımının kullanımını sorgularım. İÇERİ bir kap. Başsız kaplardan log / olay mesajlarına ihtiyacınız varsa, bu dosyaların / mesajların kabın dışında görüntülenmesini / saklanmasını sağlayan araçları kullanmak daha kolay olur diye düşünüyorum. Belki bir kullanarak günlük sürücüsü ihtiyaçlarınızı karşılayan bir kabın içine giriş yapmaktan daha iyi bir seçim olabilir.
John

2

İlgili kullanım durumuyla ilgili bazı bilgiler: Docker Cloud'da çalışan kabın içindeki çıkışı yeniden yönlendirmek istiyorsunuz.

Benim durumumda, Docker Cloud'da uzun süredir çalışan bir veri analizi komut dosyası (Java) yürütüyorum. Her bir kabın kendi sonuç dosyasını yazması gerekir. Kullanıyorum java:8-jre görüntüyü ve 'Run komutunu' üzerine yazıp aşağıdaki satırı yazın:

bash -c "java -jar /code/analyzer.jar > /data/results-$RANDOM.txt"

Bash kullanarak $RANDOM değişkeni, Docker Cloud'daki kapsayıcı sayısını, istediğim kadar ölçeklendirip, sonuçları tek tek toplayabilirim.


0

Sen tee arıyorsun

LOGFILE="logthis.txt";
IMG_alpine="alpine:3.5";

docker run --rm \
--name alpine-hello \
--hostname alpine-hello \
"$IMG_alpine" \
uname -a | tee -a $LOGFILE

cat logthis.txt
Linux alpine-hello 4.8.14-docker-2 #1 SMP Tue Jan 10 15:35:02 UTC 2017 x86_64 Linux

0

Kullanmak docker run Bir kabuk boru hattında veya kabuk yönlendirme altında run stdout ve stdout ve stderr komutlarına uygun şekilde stdin'i ve çıktıyı kabul etmek için, bu eklentiyi kullanın:

docker run -i --log-driver=none -a stdin -a stdout -a stderr ...

Örneğin. çalıştırmak için alpine görüntü ve UNIX komutunu yürütün cat İçerdiği ortamda:

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: 

yayar:

This is coming out of docker: This was piped into docker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.