Docker entrypoint and cmd together

16,224

Solution 1

When you use both entrypoint and command, the command section will be appended to entrypoint executable as arguments. Thus in your case:

ENTRYPOINT ["/start.sh"]
CMD ["aptly", "api", "serve"]

Is equivalent to running:

ENTRYPOINT["/start.sh", "aptly", "api", "serve"]

Solution 2

Can't tell much without knowing what the entrypoint does, but essentially this is what you are doing with this combination of entrypoint and cmd:

/start.sh aptly api serve

If you are after simply starting your server you can simply do something like this (valid path to the aptly executable may be neccessary):

ENTRYPOINT ["aptly"]
CMD ["api", "serve"]

Unless you are doing much more than just running an executable there's no need for an entrypoint.

Solution 3

One important note, since nobody else has mentioned it: in order to use ENTRYPOINT and CMD together, you need to specify both in the array format. Doing something like this WILL NOT WORK:

ENTRYPOINT ./my_script.sh
CMD echo "hello world"

In the code above, ./my_script.sh will be called, but CMD will not be passed in.

Share:
16,224
Vana
Author by

Vana

Updated on June 15, 2022

Comments

  • Vana
    Vana almost 2 years

    I try to setup a Docker with both entrypoint and cmd.

    FROM debian:stretch
    RUN apt-get update && \
    apt install gnupg ca-certificates -y 
    RUN echo "deb http://repo.aptly.info/ squeeze main" > /etc/apt/sources.list.d/aptly.list
    RUN apt-key adv --keyserver keys.gnupg.net --recv-keys 9E3E53F19C7DE460
    RUN apt update && apt install aptly -y
    ADD aptly.conf /etc/aptly.conf
    ADD start.sh .
    VOLUME ["/aptly"]
    ENTRYPOINT ["/start.sh"]
    CMD ["aptly", "api", "serve"]
    

    But entrypoint script is not stopping... The cmd command is not launching

    Here my script :

    #!/bin/bash
     set -e 
     init_aptly() { 
     #import pgp key
    #create nginx root folder in /aptly
    su -c "mkdir -p /aptly/.aptly/public"
    echo "12"
     #initialize repository
     #aptly create repo doze-server -   distribution="stable"
      }
      #check for first run
     if [ ! -e /aptly/.aptly/public ]; then
      init_aptly
      echo "13"
     fi
      echo "14"
    

    The script always echo 14, I would like only one and then, execute the cmd command from dockerfile

  • Vana
    Vana over 6 years
    No need cmd, just ENTRYPOINT [/start.sh aptly api serve]?
  • emix
    emix over 6 years
    Sorry I don't understand your question.
  • yamenk
    yamenk over 6 years
    You can combine executable like bash scripts CMD ./start.sh && aptly api serve
  • George Pligoropoulos
    George Pligoropoulos almost 6 years
    This is so intuitive of course.... Strong negative feelings for whoever dev implemented it like so!
  • rj487
    rj487 almost 5 years
    This ans saved me even in 2019
  • xnervwang
    xnervwang almost 3 years
    Weird... behavior?
  • benjaminchanming
    benjaminchanming over 2 years
    Thanks, you saved me from hours of debugging!
  • ADJenks
    ADJenks almost 2 years
    I must be blind but I couldn't seem to see where in the documentation it explains this. Can someone please put a link to the docs showing this?