ChatGPT解决这个技术问题 Extra ChatGPT

Starting a shell in the Docker Alpine container

To start an interactive shell for the Ubuntu image we can run:

ole@T:~$ docker run -it --rm ubuntu
root@1a6721e1fb64:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

But when this is run for the Alpine Docker image, the following results:

ole@T:~$ docker run -it --rm alpine
Error response from daemon: No command specified

What is the command for starting an interactive shell in an Alpine base container?


B
Bruno Bronosky
ole@T:~$ docker run -it --rm alpine /bin/ash
(inside container) / # 

Options used above:

/bin/ash is Ash (Almquist Shell) provided by BusyBox

--rm Automatically remove the container when it exits (docker run --help)

-i Interactive mode (Keep STDIN open even if not attached)

-t Allocate a pseudo-TTY


Sure - good idea - ash is the shell and --rm removes the container after the run is complete. So if you want the container to still be available after the run then skip usage of --rm. I'm using it since I'm only experimenting ATM.
Then how to run it with detach property like ubuntu?
I believe in both cases ... Ubuntu or Alpine ... you just give it a -d option.
+1 for noting that Alpine has ash and not bash, which, not being very familiar with Alpine, is what got me and prevented me from accessing the container earlier.
If you are on RHEL and get permission denied error, it is SELinux again... gotta do that setenforce 0 temporarily :P
j
jansanchez

Usually, an Alpine Linux image doesn't contain bash, Instead you can use /bin/ash, /bin/sh, ash or only sh.

/bin/ash

docker run -it --rm alpine /bin/ash

/bin/sh

docker run -it --rm alpine /bin/sh

ash

docker run -it --rm alpine ash

sh

docker run -it --rm alpine sh

I hope this information helps you.


What is the difference between /bin/ash and ash? Similar for /bin/sh and sh.
Hi @peter-mortensen, the difference is that ash is only a symbolic link to /bin/ash. Some linux distributions doesn't have symbolic links.
v
valiano

Nowadays, Alpine images will boot directly into /bin/sh by default, without having to specify a shell to execute:

$ sudo docker run -it --rm alpine  
/ # echo $0  
/bin/sh  

This is since the alpine image Dockerfiles now contain a CMD command, that specifies the shell to execute when the container starts: CMD ["/bin/sh"].

In older Alpine image versions (pre-2017), the CMD command was not used, since Docker used to create an additional layer for CMD which caused the image size to increase. This is something that the Alpine image developers wanted to avoid. In recent Docker versions (1.10+), CMD no longer occupies a layer, and so it was added to alpine images. Therefore, as long as CMD is not overridden, recent Alpine images will boot into /bin/sh.

For reference, see the following commit to the official Alpine Dockerfiles by Glider Labs:
https://github.com/gliderlabs/docker-alpine/commit/ddc19dd95ceb3584ced58be0b8d7e9169d04c7a3#diff-db3dfdee92c17cf53a96578d4900cb5b


M
Marcos

In case the container is already running:

docker exec -it container_id_or_name ash