স্ট্যান্ডআউটে একটি ডকার অ্যাপ্লিকেশন লিখুন


49

আমি 12 টি ফ্যাক্টর অ্যাডভাইসরির সাথে সম্মতিতে একটি তৃতীয় পক্ষের অ্যাপ্লিকেশন নিযুক্ত করছি এবং একটি বিন্দুতে যে অ্যাপ্লিকেশন লগগুলি স্টাডাউট / স্টার্ডারে প্রিন্ট করা উচিত: তারপরে ক্লাস্টারিং সফ্টওয়্যার এটি সংগ্রহ করতে পারে।

তবে অ্যাপ্লিকেশনটি কেবল ফাইল বা সিসলগে লিখতে পারে। পরিবর্তে আমি এই লগগুলি কীভাবে মুদ্রণ করব?


তারা ইতিমধ্যে syslog যাচ্ছে। আপনি সেখান থেকে তাদের নিতে পারেন!
মাইকেল হ্যাম্পটন

@ মিশেলহ্যাম্পটন, ঠিক আছে বলে মনে হচ্ছে, তবে ডকার একটি একক প্রক্রিয়া চালিয়ে যা স্টডআউটকে লিখতে পারে, এবং এই দুটি শব্দকে একত্রিত করার মত শোনাচ্ছে?
kolypto

1
আপনার ডেমন প্রক্রিয়াটি সিসলগ ব্যবহার করতে পারে এবং একটি প্রসেস প্রিন্ট করতে পারে?
qkrijger

@ কিকিরিজার, ভালো কথা! এখন কারও সাথে অভিজ্ঞতা থাকলে ...?
kolypto

উত্তর:


107

একটি আশ্চর্যজনক রেসিপি দেওয়া হয় Nginx ডকফেরফায়লে :

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log

সহজভাবে, অ্যাপটি ফাইল হিসাবে এটি লেখা চালিয়ে যেতে পারে, তবে ফলস্বরূপ লাইনগুলি stdout& তে চলে যাবে stderr!


2
এই. হয়। মাত্র। উজ্জ্বল। এবং বহুমুখী।
স্পেসডিভার

11
আপনি যে জিনিসটি চালাচ্ছেন সেটি যখন অ-রুট প্রক্রিয়া হিসাবে নিজেকে ব্যাকগ্রাউন্ডে দাঁড় করানোর জন্য জোর দেয় তখন এর সাথে সমস্যাযুক্ত একটি জিনিস। আমার সাথে এটি হচ্ছে squid3এবং এর পরে অনুমতি নিয়ে সমস্যা হচ্ছে /dev/stdout
মাইকপুরভিস

4
এটি সর্বদা কাজ করে না - উদাহরণস্বরূপ যদি অ্যাপ্লিকেশনটি ফাইলটি সন্ধান করার চেষ্টা করে তবে এই পদ্ধতিটি সাধারণত কাজ করবে না।
মিশ্রজা

লিঙ্কটি নিচে ...
বাবকেন ভার্দনিয়ান

4
সবকিছুই জয়ের জন্য একটি ফাইল।
রাবারডাক

16

অন্য একটি প্রশ্নে, পিতামাতারা যখন প্রস্থান করেন তখন শিশুটিকে হত্যা করুন , আমি এই প্রতিক্রিয়াটিকে বাছাই করতে সহায়তা পেয়েছি এমন প্রতিক্রিয়া পেয়েছি।

এইভাবে, আমরা অ্যাপ্লিকেশনটি কনফিগার করি যাতে এটি কোনও ফাইলে লগ হয় এবং ক্রমাগত tail -fএটি থাকে। ভাগ্যক্রমে, tailগ্রহণ করতে পারে --pid PID: নির্দিষ্ট প্রক্রিয়াটি প্রস্থান করার সময় এটি প্রস্থান করবে। আমরা $$সেখানে রেখেছি : বর্তমান শেলটির পিআইডি।

চূড়ান্ত পদক্ষেপ হিসাবে, চালু হওয়া অ্যাপ্লিকেশনটি exec'এড', যার অর্থ বর্তমান অ্যাপ্লিকেশনটির সাথে বর্তমান শেলটি পুরোপুরি প্রতিস্থাপন করা হয়েছে।

রানার স্ক্রিপ্ট, এটির run.shমতো দেখাবে:

#! /usr/bin/env bash
set -eu

rm -rf /var/log/my-application.log
tail --pid $$ -F /var/log/my-application.log &

exec /path/to/my-application --logfile /var/log/my-application.log

দ্রষ্টব্য: tail -Fআমরা ফাইলের নামগুলি ব্যবহার করে এবং এটি পরে প্রদর্শিত হলেও এটি সেগুলি পড়বে!

পরিশেষে, সর্বনিম্ন ডকফেরাইল:

FROM ubuntu
ADD run.sh /root/run.sh
CMD ['/root/run.sh']

দ্রষ্টব্য: কিছু অত্যন্ত আশ্চর্যজনক tail -fআচরণ (যা "একটি দূরবর্তী ফাইলের সাথে প্রতিস্থাপন করা হয়েছে this এই নামটি ছেড়ে দেওয়া" বলে কাজ করার জন্য) আমি আরেকটি পদ্ধতির চেষ্টা করেছি: সমস্ত পরিচিত লগ ফাইলগুলি তৈরির সময় এবং কাটা কাটা হয়েছে: এইভাবে আমি নিশ্চিত করি যে সেগুলি বিদ্যমান আছে , এবং কেবল তখনই - তাদের লেজ দিন:

#! /usr/bin/env bash
set -eu

LOGS=/var/log/myapp/

( umask 0 && truncate -s0 $LOGS/http.{access,error}.log )
tail --pid $$ -n0 -F $LOGS/* &

exec /usr/sbin/apache2 -DFOREGROUND

বিশেষত অ্যাপাচি সার্ভারের জন্য আমি পাইপড লগগুলি ব্যবহার করছি ( httpd.apache.org/docs/2.4/logs.html#piped ) এবং দেখে মনে হচ্ছে এটি কাজ করে।
পিএইচপি-কোডার

আলপাইন দিয়ে অনুরূপ সমস্যাগুলি সমাধান করে এবং tail--pid বিকল্প ছাড়াই ব্যাসিবক্সে সূক্ষ্ম কাজ করে বলে মনে হচ্ছে ।
রায়ান

কাজটি আমার পক্ষে কাজ করেছিল। চরম দরকারী, আপনাকে ধন্যবাদ।
তমাস কলম্যান

8

ডকার পাত্রে ব্যাকগ্রাউন্ড প্রক্রিয়াটির জন্য, যেমন / bin / bash এ এক্সিকিউটের সাথে সংযোগ স্থাপন করতে সক্ষম হয়েছি।

echo "test log1" >> /proc/1/fd/1

এটি আউটপুটটিকে পিড 1 এর স্ট্যান্ডআউটে প্রেরণ করে, যা এক ডকার পিকআপ।


1
এটা সঠিক উত্তর. লগগুলি পিআইডি 1 এর জন্য স্টাডাউটে প্রেরণ করা উচিত এবং যদি আপনার অ্যাপ্লিকেশন অন্য পিআইডি এর অধীনে চলছে তবে এটি দ্বারা docker logsবা এটি দেখা যাবে না kubectl logs। আমার কাছে একটি ধারক রয়েছে যা ক্রোনটাবের মাধ্যমে কাজটি শিডিউল করে যা পিআইডি 1 হিসাবে চলছে না running
leeman24

6

এনজিনেক্সের জন্য আপনি এটিকে nginx.confনির্দেশ করতে /dev/stderrএবং /dev/stdoutপছন্দ করতে পারেন

user  nginx;
worker_processes  4;
error_log  /dev/stderr;
http {
    access_log  /dev/stdout  main;
...

এবং আপনার Dockerfileপ্রবেশ করা উচিত

/usr/sbin/nginx -g 'daemon off;'

মাস্টার প্রক্রিয়া যেমন চলছে না তখন কাজ করে নাroot
pedee
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.