How to run 2 commands with docker exec

I need to run 2 commands with docker exec. I am copying a file out of the docker container and don't want to have to deal with credentials to use something like ssh. This command copies a file:

sudo docker exec boring_hawking tar -cv /var/log/file.log | tar -x

But it creates a subdirectory var/log, I want to avoid that so if I could do these in the docker container I should be good:

cd /var/log ; tar -cv ./file.log

How can I make docker exec run 2 commands?


Solution 1:

This led to the answer: Escape character in Docker command line I ended up doing this:

sudo docker exec boring_hawking bash -c 'cd /var/log ; tar -cv ./file.log' | tar -x

So it works by, sort of, running the one bash command with a parameter that is the 2 commands I want to run.

Solution 2:

Quite often, the need for several commands is to change the working directory — as in the OP's question.

For that, docker now has a -w option to specify the working directory. E.g. in the present case

docker exec -w /var/log boring_hawking tar -cv ./file.log

Solution 3:

For anyone else who stumbles across this and wants a different way to specify multiple commands in order to execute a more complex script:

cat <<EOF | docker exec --interactive boring_hawking sh
cd /var/log
tar -cv ./file.log
EOF

Solution 4:

If anyone else came here for the awesome answer, but also wants a better way to solve OP's original problem (OP's OP..?) to copy a file out of a docker container, there is now a docker cp command that will do this: https://docs.docker.com/engine/reference/commandline/cp/