Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do "docker run -t" outputs include \r in the command output?

Tags:

docker

I'm using Docker client Version: 18.09.2.

When I run start a container interactively and run a date command, then pipe its output to hexdump for inspection, I'm seeing a trailing \n as expected:

$ docker run --rm -i -t alpine
/ # date | hexdump -c
0000000   T   h   u       M   a   r           7       0   0   :   1   5
0000010   :   0   6       U   T   C       2   0   1   9  \n
000001d

However, when I pass the date command as an entrypoint directly and run the container, I get a \r \n every time there's a new line in the output.

$ docker run --rm -i -t --entrypoint=date alpine | hexdump -c
0000000   T   h   u       M   a   r           7       0   0   :   1   6
0000010   :   1   9       U   T   C       2   0   1   9  \r  \n
000001e

This is weird.

It totally doesn't happen when I omit -t (not allocating any TTY):

docker run --rm -i --entrypoint=date alpine | hexdump -c
0000000   T   h   u       M   a   r           7       0   0   :   1   7
0000010   :   3   0       U   T   C       2   0   1   9  \n
000001d

What's happening here?

This sounds dangerous, as I use docker run command in my scripts, and if I forget to omit -t from my scripts, the output I'll collect from docker run command will have invisible/non-printible \r characters which can cause all sorts of issues.

like image 488
ahmet alp balkan Avatar asked Mar 07 '19 00:03

ahmet alp balkan


People also ask

What is the T flag in docker?

The -t (or --tty) flag tells Docker to allocate a virtual terminal session within the container. This is commonly used with the -i (or --interactive) option, which keeps STDIN open even if running in detached mode (more about that later).

What is the purpose of the docker Run command?

The docker run command is the command used to launch Docker containers. As such, it's familiar to anyone starting or running Docker containers on a daily basis.

What is in docker Run command?

The docker run command creates a container from a given image and starts the container using a given command. It is one of the first commands you should become familiar with when starting to work with Docker.

What is the command you run to run a container from an image?

To run an image inside of a container, we use the docker run command. The docker run command requires one parameter and that is the image name.


1 Answers

tldr; This is a tty default behaviour and unrelated to docker. Per the ticket filed on github about your exact issue.


Quoting the relevant comments in that ticket:

Looks like this is indeed TTY by default translates newlines to CRLF

$ docker run -t --rm debian sh -c "echo -n '\n'" | od -c
0000000   \r  \n
0000002

disabling "translate newline to carriage return-newline" with stty -onlcr correctly gives;

$ docker run -t --rm debian sh -c "stty -onlcr && echo -n '\n'" | od -c
0000000   \n
0000001

Default TTY options seem to be set by the kernel ... On my linux host it contains:

/*
 * Defaults on "first" open.
 */
#define TTYDEF_IFLAG    (BRKINT | ISTRIP | ICRNL | IMAXBEL | IXON | IXANY)
#define TTYDEF_OFLAG    (OPOST | ONLCR | XTABS)
#define TTYDEF_LFLAG    (ECHO | ICANON | ISIG | IEXTEN | ECHOE|ECHOKE|ECHOCTL)
#define TTYDEF_CFLAG    (CREAD | CS7 | PARENB | HUPCL)
#define TTYDEF_SPEED    (B9600)

ONLCR is indeed there.

When we go looking at the ONLCR flag documentation, we can see that:

[-]onlcr: translate newline to carriage return-newline

To again quote the github ticket:

Moral of the story, don't use -t unless you want a TTY.
TTY line endings are CRLF, this is not Docker's doing.

like image 57
Gavin Miller Avatar answered Sep 27 '22 20:09

Gavin Miller