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/