how to use docker ENTRYPOINT with shell script file combine parameter

35,245

When a Docker container is run, it runs the ENTRYPOINT (only), passing the CMD as command-line parameters, and when the ENTRYPOINT completes the container exits. In the Dockerfile the ENTRYPOINT has to be JSON-array syntax for it to be able to see the CMD arguments, and the script itself needs to actually run the CMD, typically with a line like exec "$@".

The single simplest thing you can do to clean this up is not to try to go back and forth between environment variables and positional parameters. The ENTRYPOINT script will be able to directly read the ENV variables you set in the Dockerfile (or override with docker run -e options). So if you delete the first lines of the script that set these variables from positional parameters, and make sure to run the CMD

#!/bin/sh
# delete the lines that set CONTAINER_NAME et al.
rm -f /etc/nginx/sites-enabled/default
sed -ri 's@CONTAINER_NAME@'${CONTAINER_NAME}'@' /etc/nginx/sites-available/ssl
...
# and add this at the end
exec "$@"

and then change the Dockerfile to not pass positional parameters but do use JSON-array syntax for ENTRYPOINT

ENTRYPOINT ["/etc/nginx/docker-entrypoint.sh"]
CMD ["nginx"]

that should get you off the ground.

It's worth considering how much of this you actually need to be configurable. For instance, would you ever need a path different from the default /etc/nginx/certs inside the isolated container filesystem space? Usually with the standard nginx Docker Hub image you work with it by injecting an entire complete configuration file and if you choose to do that it simplifies your Docker setup.

Other generic suggestions: remove the VOLUME declarations (they potentially cause confusing behavior later in the Dockerfile and leak anonymous volumes and aren't otherwise necessary); don't make executable files world-writable (chmod 0755, not 0777); RUN apt-get update && apt-get install in the same Dockerfile command.

Share:
35,245
imori
Author by

imori

Updated on March 03, 2020

Comments

  • imori
    imori about 4 years

    i write shell script file and use this with docker ENTRYPOINT but when i run docker image, it just stop without any error log because of entrypoint code line

    my Dockerfile

    FROM ubuntu:16.04
    MAINTAINER limtaegeun <[email protected]>
    
    RUN apt-get update
    RUN apt-get install -y nginx
    RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
    
    # Define mountable directories.
    VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]
    
    ENV CONTAINER_NAME nodejs
    ENV SERVER_NAME myserver.com
    ENV PEM_PATH /etc/nginx/certs/cert.pem
    ENV KEY_PATH /etc/nginx/certs/cert.key
    
    WORKDIR /etc/nginx
    
    ADD ./sites-available/ssl /etc/nginx/sites-available/ssl
    ADD ./docker-entrypoint.sh /etc/nginx/docker-entrypoint.sh
    RUN chmod 777 /etc/nginx/docker-entrypoint.sh
    EXPOSE 80 443
    ENTRYPOINT /etc/nginx/docker-entrypoint.sh ${CONTAINER_NAME} ${SERVER_NAME} ${PEM_PATH} ${KEY_PATH}
    CMD ["nginx"]
    

    docker-entrypoint.sh

    #!/bin/sh
    
    CONTAINER_NAME=$1
    SERVER_NAME=$2
    PEM_PATH=$3
    KEY_PATH=$4
    
    rm -f /etc/nginx/sites-enabled/default
    sed -ri 's@CONTAINER_NAME@'${CONTAINER_NAME}'@' /etc/nginx/sites-available/ssl
    sed -ri 's@SERVER_NAME@'${SERVER_NAME}'@' /etc/nginx/sites-available/ssl
    sed -ri 's@PEM_PATH@'${PEM_PATH}'@' /etc/nginx/sites-available/ssl
    sed -ri 's@KEY_PATH@'${KEY_PATH}'@' /etc/nginx/sites-available/ssl
    # cp -f sites-available/ssl sites-available/default
    ln -s /etc/nginx/sites-available/ssl /etc/nginx/sites-enabled/default
    

    my docker run command

    docker run -v /home/ubuntu/Docker-nginx-cloudflare-ssl-proxy/certs:/etc/nginx/certs \
    --name nginx-ssl -p 443:443 -p 80:80 --network nginx-net --rm -d nginx-cloudfare-ssl-proxy
    

    what is problem??