Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't the cut command work for a "docker image ls" command?

Tags:

bash

shell

I'm trying to get the docker image id for a certain image so I do

$ docker image ls

REPOSITORY                                                          TAG                 IMAGE ID            CREATED             SIZE
123456789012.dkr.ecr.us-east-1.amazonaws.com/some-name1             60                  4a625fb9a2a4        5 hours ago         3.97GB
987654321012.dkr.ecr.us-east-1.amazonaws.com/some-other-name2       365                 59b27e46effc        6 days ago          3.98GB

I expect this to give me the image id, i.e., 4a625fb9a2a4 in this case...

$ docker image ls | grep name1 | cut -d " " -f3

...but it doesn't, it gives a blank. What am I missing?

This NEEDS to be a simple shell script so I can embed it in a Groovy script in a Jenkinsfile pipeline.

like image 355
Chris F Avatar asked May 31 '18 13:05

Chris F


3 Answers

Because you have several " " between each data.

Easier way is to strip whitespaces to a single space and cut:

docker image ls | grep name1 | tr -s ' ' | cut -d " " -f 3

EDIT: chepner's answer is to prefere, but I let this one live since original question was "why".

like image 171
Arount Avatar answered Oct 20 '22 03:10

Arount


The best thing to do is let docker images ls do all the work, instead of parsing its default output.

$ docker image ls --filter "reference=*name1*" -q
4a625fb9a2a4

--filter replaces your grep command, and -q replaces cut. There is also a --format option for more precise control over the output, but -q is effectively just a shortcut for --format '{{.ID}}'.

If, for whatever reason, --filter doesn't do what you need, you can always use --format to produce output that is more easily parsed by other commands.

like image 35
chepner Avatar answered Oct 20 '22 04:10

chepner


I think that awk is better for splitting up columnar output. For example:

$ docker image ls | awk '/fedora/ {print $3}'
cc510acfcd70
5292e27c6dac
422dc563ca32

Alternately, you could reform the output using --format to work better with cut:

$ docker image ls --format '{{ .Repository }} {{ .ID }}' | grep fedora | cut -d" " -f2
cc510acfcd70
5292e27c6dac
422dc563ca32
like image 24
larsks Avatar answered Oct 20 '22 05:10

larsks