Redirecting command output in docker
Solution 1
I'd like to question your use-case. Why do you need to redirect stderr/stdout to a log file in the container? Merged stderr and stdout are available outside the container using "docker logs", and they can be redirected to a file (outside of the container.) More details can be found here
Solution 2
Here's some info on a related use case: You want to redirect the output inside the container, which is running on Docker Cloud.
In my case, I'm executing a long-running data analysis script (Java) on Docker Cloud. Each container is supposed to write its own results file. I'm using the java:8-jre
image and overwrite the 'Run command' with the following line:
bash -c "java -jar /code/analyzer.jar > /data/results-$RANDOM.txt"
By using bash's $RANDOM
variable, I can scale up the number of containers in Docker Cloud as much as I want, while still collecting the results individually.
Solution 3
To use docker run
in a shell pipeline or under shell redirection, making run
accept stdin and output to stdout and stderr appropriately, use this incantation:
docker run -i --log-driver=none -a stdin -a stdout -a stderr ...
e.g. to run the alpine
image and execute the UNIX command cat
in the contained environment:
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:
emits:
This is coming out of docker: This was piped into docker
Solution 4
You are looking for tee
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
Related videos on Youtube
Comments
-
Dreen over 1 year
I want to do some simple logging for my server which is a small Flask app running in a Docker container.
Here is the 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"]
As you can see on the last line I redirect stderr and stdout to a file. Now I run this container and shell into it
docker run -d -p 80:80 perfektimprezy docker exec -it "... id of container ..." bash
And observe the following things:
The server is running and the website working
There is no
/srv/server.log
ps aux | grep python
yields: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
But there are no logs... HOWEVER, if I
docker attach
to the container I can see the app generating output in the console.How do I properly redirect stdout/err to a file when using Docker?
-
Dreen over 8 yearsyoure right, it seems i can even do
docker logs ID > stdout.log 2>stdout.log
but i still cant see an exception... im starting to think it might be dying without an error -
hheimbuerger about 8 yearsHere's a use case: you're running the container on Docker Cloud (where you can't just redirect the log output to a file on the (remote and not easily accessible) node. You run a lot of different headless containers and you want to collect the respective outputs (possibly gigabytes of data) a few hours later.
-
John over 6 years@hheimbuerger "Why do you need to redirect stderr/stdout to a log file in the container?" Even with your use case description, I would question the use of logging INSIDE a container. If you need log/event messages from headless containers, I think it would be easier to use tools that enable those files/messages to be viewed/stored outside of the container. Perhaps using a logging driver that meets your needs might be a better choice than logging inside of a container.
-
Yordan Georgiev almost 5 years` docker events & echo copy paste an event id docker logs <<event-id>> `