Reputation: 3236
I am trying to run my local docker file/docker compose setup.
I get the following error.
docker-compose.exe up
Starting docker_sshd_1 ... done
Attaching to docker_sshd_1
sshd_1 | Extra argument /usr/sbin/sshd.
docker_sshd_1 exited with code 1
When I look a the logs
docker logs 76d6c9682749
Extra argument /usr/sbin/sshd.
When I try to start or run it
docker start -ai 76d6c9682749
Extra argument /usr/sbin/sshd.
Docker ps-a shows
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
76d6c9682749 ansible-test:latest "/usr/sbin/sshd -D -…" 17 seconds ago Exited (1) 15 seconds ago docker_sshd_1
docker-compose up --build
docker-compose.exe up --build
Building sshd
Step 1/6 : FROM ubuntu:18.04
---> 1d9c17228a9e
Step 2/6 : RUN apt-get update && apt-get install -y net-tools netcat openssh-server curl
---> Using cache
---> a1c69db6f87d
Step 3/6 : RUN mkdir /var/run/sshd && echo 'root:ansibletest' | chpasswd && echo '\n#allow root\nPermitRootLogin yes\n' >> /etc/ssh/sshd_config
---> Using cache
---> 8af61a1ff284
Step 4/6 : EXPOSE 22
---> Using cache
---> 7483e7b442b4
Step 5/6 : CMD ["/usr/sbin/sshd", "-D" ]
---> Using cache
---> 67634af48cd9
Step 6/6 : ENTRYPOINT ["/usr/sbin/sshd", "-D", "-d"]
---> Running in 304247678be0
Removing intermediate container 304247678be0
---> e8c85c2deea0
Successfully built e8c85c2deea0
Successfully tagged ansible-test:latest
Recreating docker_sshd_1 ... done
Attaching to docker_sshd_1
sshd_1 | Extra argument /usr/sbin/sshd.
docker_sshd_1 exited with code 1
Docker inspect shows the following for path and args
λ docker inspect --format='{{.Path}}' e8c85c2deea0
'/usr/sbin/sshd'
λ docker inspect --format='{{.Args}}' e8c85c2deea0
'[-D /usr/sbin/sshd -D]'
my docker compose file looks like this
version: '3'
services:
sshd:
build: .
image: ansible-test:latest
ports:
- "2022:22" # bines local port 2022 to container port 22 / sshd
- "8080:80" # binds local port 8080 to container port 80 / httpd
My docker file looks like this
# borrowed https://docs.docker.com/engine/examples/running_ssh_service/
FROM ubuntu:18.04
# some useful debuging tools to troubleshoot on these containers
RUN apt-get update && apt-get install -y \
net-tools \
netcat \
openssh-server \
curl
# configure sshd to work as we need it in 18.04
# sets the rootpassword to ansibletest
RUN mkdir /var/run/sshd && \
echo 'root:ansibletest' | chpasswd && \
echo '\n#allow root\nPermitRootLogin yes\n' >> /etc/ssh/sshd_config
EXPOSE 22
ENTRYPOINT ["/usr/sbin/sshd", "-D" ]
#ENTRYPOINT ["/usr/sbin/sshd", "-D", "-d"]
# for production system remove "-d"
# -D When this option is specified, sshd will not detach and does not become a daemon.
# This allows easy monitoring of sshd.
# -d Debug mode. The server sends verbose debug output to standard error, and does not put itself in the background.
# The server also will not fork and will only process one connection.
# This option is only intended for debugging for the server.
# Multiple -d options increase the debugging level. Maximum is 3.
# by default start sshd as background daemon
CMD ["/usr/sbin/sshd", "-D" ]
# used for debugging lets you pass options to sshd on startup
#CMD ["/usr/sbin/sshd", "-D", '-d']
Upvotes: 1
Views: 2720
Reputation: 3236
In a substantial amount of trial and error.
The docker inspect above gives the clearest answer as to what is actually happening.
It says correctly that there are extra arguments
λ docker inspect --format='{{.Path}}' 1be69f7e6140
'/usr/sbin/sshd'
λ docker inspect --format='{{.Args}}' 1be69f7e6140
'[-D /usr/sbin/sshd -D]'
here it is trying to exec path and args as
'/usr/sbin/sshd' '[-D /usr/sbin/sshd -D]
I want it to come up like this.
λ docker inspect --format='{{.Path}}' cced1543f71e
'/usr/sbin/sshd'
λ docker inspect --format='{{.Args}}' cced1543f71e
'[-D]'
which will exec as '/usr/sbin/sshd' '[-D]'
Essentially I am misunderstanding how the ENTRYPOINT
and CMD
work together.
From the docs for CMD
The
CMD
instruction has three forms:
CMD ["executable","param1","param2"]
(exec form, this is the preferred form)
CMD ["param1","param2"]
(as default parameters to ENTRYPOINT)
I need to use the second form for this to work correctly.
If I am using ENTRYPOINT
and CMD
in the same docker file.
I can not put the executable
as a parameter in the CMD
section.
It needs to be just the arguments I want to pass to the entry point.
So I sent the default for the docker run to use exec from ENTRYPOINT
and parameters from CMD
but I can override it directly from the command line. As
docker run image-name arg1 agr2
My fix is
ENTRYPOINT ["/usr/sbin/sshd"]
CMD ["-D" ]
This link helped me to understand
https://medium.com/@oprearocks/how-to-properly-override-the-entrypoint-using-docker-run-2e081e5feb9d
Upvotes: 2