Docker run exits immediately despite --detach, --interactive, --tty, and providing a command - docker

On a Windows 10 host, Docker version 19.03.13, build 4484c46d9d, I tried running a docker image with all possible combinations of --tty, --interactive, and --detach, but none of them brings me to a bash prompt, always exiting immediately. /bin/bash is present in the image. The Dockerfile is from https://hub.docker.com/r/astj/centos5-vault/dockerfile
I ran:
docker run <switches> astj/centos5-vault /bin/bash
where <switches> had been exercised with the full set of -t, -i, -d combinations, namely:
-d, -i, -t, -it, -id, -td, -dit
In all cases, the container exits immediately.
If I change /bin/bash to ls, I can see a directory listing. But of course, the container exits immediately as expected. To troubleshoot, I experimented with the following commands, with these results:
+-------------------------------------------------------+----------------------------------------------------------------+
| Command | Output |
+-------------------------------------------------------+----------------------------------------------------------------+
| docker run astj/centos5-vault /bin/bash | None. Exits. |
| docker run -i astj/centos5-vault /bin/bash | None. Exits. |
| docker run -it astj/centos5-vault /bin/bash | None. Exits. |
| docker run -t astj/centos5-vault /bin/bash | None. Exits. |
| docker run -td astj/centos5-vault /bin/bash | Prints a container hash, then exits |
| docker run -id astj/centos5-vault /bin/bash | Prints a container hash, then exits |
| docker run -d astj/centos5-vault /bin/bash | Prints a container hash, then exits |
| docker run -dit astj/centos5-vault /bin/bash | Prints a container hash, then exits |
| docker run -it astj/centos5-vault ls -la /bin/bash | "-rwxr-xr-x 1 root root 768664 Jul 10 2013 /bin/bash". Exits. |
| docker run -it astj/centos5-vault /bin/bash --version | None. Exits. |
| docker run -it astj/centos5-vault /bin/bash --login | None. Exits. |
| docker run -it astj/centos5-vault /bin/uname -r | "4.19.128-microsoft-standard". Exits. |
| docker run astj/centos5-vault whoami | "root". Exits. |
+-------------------------------------------------------+----------------------------------------------------------------+
I tried to troubleshoot but docker logs <container> doesn't show a single line of log.
Does anyone know why the /bin/bash command still causes the container to exit immediately instead of bringing me to a bash prompt?

I ran into the above issue as well, seems the user above also posted this question separately, and found an answer there:
https://forums.docker.com/t/docker-run-exits-immediately-despite-detach-interactive-tty-and-providing-a-command/99444/5
For anyone finding their way here later, in my configuration mentioned above
this was an issue specific to Windows environments which was resolved
with a change in Windows 10 Build 18995.
Steps to resolve:
Create file : %userprofile%.wslconfig
Add this two lines :
[wsl2]
kernelCommandLine = vsyscall=emulate
Restart wsl
wsl --shutdown
Restart Docker Desktop
I found the answer here: https://github.com/microsoft/WSL/issues/4694#issuecomment-556152512
(Enable vsyscall=emulate in the kernel config to run older base images such as Centos 6)
This worked for me, it seems to only affect certain distributions, for me it was also centos 6

Related

How can I restore all of my lost Docker containers?

After a restart of VM I was not able to run any docker command. I follow some question on stack overflow and run the following command ps axf | grep docker | grep -v grep | awk '{print "kill -9 " $1}' | sudo sh
Now There is no image or container.
Result of commands
docker ps and ps -a
docker images list
docker ls
docker ls -a
All the command return empty list. Everything has been clean up.
Is there any way to find our backups or restore the deleted containers?

how to pass output of a command to another in shell script

I am trying to ssh into server, and into a docker container to run the service. however I am not able to store containerId into a variable to pass it to enter the container.
#!/bin/bash
ssh test_server << EOF
ls
sudo docker ps | grep 'tests_service_image' | colrm 13 # This command works
containerId=$(sudo docker ps | grep 'tests_service_image' | colrm 13) # This doesn't
sudo docker exec -i "$containerId" bash # Throws error since containerId is empty
./run.sh
EOF
exit
The problem is that you are doing variable/function expansions on your own side. You need to escape those so that those expansions happen on the server side.
#!/bin/sh
ssh test_server << EOF
containerId=\$(sudo docker ps | grep 'tests_service_image' | colrm 13)
sudo docker exec -i "\$containerId" bash
./run.sh
EOF
exit
Edit:
Pass it directly to docker exec command like so
sudo docker exec -i $(sudo docker ps | grep 'tests_service_image' | colrm 13) bash
Original Answer:
This is written assuming that the script execution is done post sshing into the server. but modified the answer to above based on the specific query
container ID is stored in variable containerId, you are getting the error Error: No such container: because you are passing a different variable $container instead of $containerId to docker exec command.

How can I grep a process in BusyBox using ps

I am getting below error in jenkins pipeline when I try to run ps -ef|grep process command:
ps: unrecognized option: p
BusyBox v1.27.2 (2017-12-12 10:41:50 GMT) multi-call binary.
Usage: ps [-o COL1,COL2=HEADER]
Show list of processes
-o COL1,COL2=HEADER Select columns for displayI have Jenkins version 2.135 and
I have BusyBox v1.27.2
Can some one tell me how can I avoid this error for ps -ef|grep process without installing the alpine image
You can use
docker exec -it container_name ps -ef | grep process
or you can do ps -ef | grep process into your container by running docker exec -it container_name /bin/bash

Piped command is failing inside docker container

I'm executing this command from docker host which is finally not giving me any error on stdout. And completes successfully on prompt but doesn't executes what it is supposed to do inside container.
Can someone please help me identify what am i doing wrong?
docker exec -dt SPSSC /bin/bash -c "grep -ril 'LOCALIZATION_ENABLED="false"' /opt/tpa/confd/config/* | grep -v 'diameter' | xargs sed -i 's/LOCALIZATION_ENABLED="false"/LOCALIZATION_ENABLED="true"/g'"

Get Docker container id from container name

What is the command to get the Docker container id from the container name?
In Linux:
sudo docker ps -aqf "name=containername"
Or in OS X, Windows:
docker ps -aqf "name=containername"
where containername is your container name.
To avoid getting false positives, as #llia Sidorenko notes, you can use regex anchors like so:
docker ps -aqf "name=^containername$"
explanation:
-q for quiet. output only the ID
-a for all. works even if your container is not running
-f for filter.
^ container name must start with this string
$ container name must end with this string
You can try this:
docker inspect --format="{{.Id}}" container_name
This approach is OS independent.
Get container Ids of running containers ::
$docker ps -qf "name=IMAGE_NAME"
-f: Filter output based on conditions provided
-q: Only display numeric container IDs
Get container Ids of all containers ::
$docker ps -aqf "name=IMAGE_NAME"
-a: all containers
You could use the following command to print the container id:
docker container ls | grep 'container-name' | awk '{print $1}'
As a bonus point, if you want to login to the container with a container name:
docker exec -it $(docker container ls | grep 'container-name' | awk '{print $1}') /bin/bash
The following command:
docker ps --format 'CONTAINER ID : {{.ID}} | Name: {{.Names}} | Image: {{.Image}} | Ports: {{.Ports}}'
Gives this output:
CONTAINER ID : d8453812a556 | Name: peer0.ORG2.ac.ae | Image: hyperledger/fabric-peer:1.4 | Ports: 0.0.0.0:27051->7051/tcp, 0.0.0.0:27053->7053/tcp
CONTAINER ID : d11bdaf8e7a0 | Name: peer0.ORG1.ac.ae | Image: hyperledger/fabric-peer:1.4 | Ports: 0.0.0.0:17051->7051/tcp, 0.0.0.0:17053->7053/tcp
CONTAINER ID : b521f48a3cf4 | Name: couchdb1 | Image: hyperledger/fabric-couchdb:0.4.15 | Ports: 4369/tcp, 9100/tcp, 0.0.0.0:5985->5984/tcp
CONTAINER ID : 14436927aff7 | Name: ca.ORG1.ac.ae | Image: hyperledger/fabric-ca:1.4 | Ports: 0.0.0.0:7054->7054/tcp
CONTAINER ID : 9958e9f860cb | Name: couchdb | Image: hyperledger/fabric-couchdb:0.4.15 | Ports: 4369/tcp, 9100/tcp, 0.0.0.0:5984->5984/tcp
CONTAINER ID : 107466b8b1cd | Name: ca.ORG2.ac.ae | Image: hyperledger/fabric-ca:1.4 | Ports: 0.0.0.0:7055->7054/tcp
CONTAINER ID : 882aa0101af2 | Name: orderer1.o1.ac.ae | Image: hyperledger/fabric-orderer:1.4 | Ports: 0.0.0.0:7050->7050/tcp
If you want to get complete ContainerId based on Container name then use following command
docker ps --no-trunc -aqf name=containername
In my case I was running Tensorflow Docker container in Ubuntu 20.04 :Run your docker container in One terminal , I ran it with
docker run -it od
And then started another terminal and ran below docker ps with sudo:
sudo docker ps
I successfully got container id:
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
e4ca1ad20b84 od "/bin/bash" 18 minutes ago
Up 18 minutes unruffled_stonebraker
Thanks for the answer of https://stackoverflow.com/a/65513726/889126, it gave me an idea to make a complete bash script as it is
export api_image_id=$(docker inspect --format="{{.Id}}" <image-name> | sed '/^[[:space:]]*$/d')
sudo docker exec -i -t ${api_image_id} /bin/bash
I need a specific container and make a script to extract some info from it in a quick sight.
Hope this would help others.
I tried sudo docker container stats, and it will give out Container ID along with details of memory usage and Name, etc. If you want to stop viewing the process, do Ctrl+C. I hope you find it useful.
I also need the container name or Id which a script requires to attach to the container.
took some tweaking but this works perfectly well for me...
export svr=$(docker ps --format "table {{.ID}}"| sed 's/CONTAINER ID//g' | sed '/^[[:space:]]*$/d')
docker exec -it $svr bash
The sed command is needed to get rid of the fact that the words CONTAINER ID gets printed too ... but I just need the actual id stored in a var.
To have container id and image Id -
$ docker container ls -a | awk 'NR>1 {print $1, $2}'
Docker image inspect ImageName\ImageId --format={{'.ConatinerConfig.Hostname'}}
The simplest way I can think of is to parse the output of docker ps
Let's run the latest ubuntu image interactively and connect to it
docker run -it ubuntu /bin/bash
If you run docker ps in another terminal you can see something like
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8fddbcbb101c ubuntu:latest "/bin/bash" 10 minutes ago Up 10 minutes gloomy_pasteur
Unfortunately, parsing this format isn't easy since they uses spaces to manually align stuff
$ sudo docker ps | sed -e 's/ /#/g'
CONTAINER#ID########IMAGE###############COMMAND#############CREATED#############STATUS##############PORTS###############NAMES
8fddbcbb101c########ubuntu:latest#######"/bin/bash"#########13#minutes#ago######Up#13#minutes###########################gloomy_pasteur######
Here is a script that converts the output to JSON.
https://gist.github.com/mminer/a08566f13ef687c17b39
Actually, the output is a bit more convenient to work with than that. Every field is 20 characters wide.
[['CONTAINER ID',0],['IMAGE',20],['COMMAND',40],['CREATED',60],['STATUS',80],['PORTS',100],['NAMES',120]]

Resources