nelaaro
nelaaro

Reputation: 3236

Docker run fails error ' Extra argument XXX'

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

Answers (1)

nelaaro
nelaaro

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

Related Questions