Multiple RUN instructions vs. single CMD to execute setup script in Dockerfile to initialize container

What the is best practice for using many RUN commands in a Dockerfile to setup the image vs. a single CMD instruction to execute a script when the container starts?

For example:

  • How to create read-only user in the Docker Registry v2?
  • How can I convert a Docker image into a (vagrant) VirtualBox box?
  • Error using mount command within Dockerfile
  • Execute a script before CMD
  • How can I disable the default composer install in CircleCI?
  • Unable to migrate Django db when using docker container
  • FROM  centos:latest
    
    RUN useradd myuser
    RUN mkdir -p /usr/local/myapp
    ADD ./resources/myapp.zip /usr/local/myapp
    RUN unzip /usr/local/myapp/myapp.zip
    RUN chown -R myuser:myuser /usr/local/myapp
    
    CMD ["/usr/local/myapp/bin/app"]
    

    vs.

    FROM  centos:latest
    
    ADD ./resources/myapp.zip /
    ADD ./resources/setup.sh / 
    RUN chmod +x /setup.sh
    
    # setup.sh will create the user, extract the zip, execute the binary
    CMD ["/setup.sh"]
    

  • When I use Deployment in Kubernetes, what's the differences between apps/v1beta1 and extensions/v1beta1?
  • Docker deployments fail on Marathon, work fine otherwise
  • Docker relationship to VMs and LXC
  • Check the File in Exited Container
  • Symfony 3 assets no update
  • Docker Socket Without TLS
  • One Solution collect form web for “Multiple RUN instructions vs. single CMD to execute setup script in Dockerfile to initialize container”

    The first example will be better for running app multiple times. If you were to use ENTRYPOINT instead of CMD then you could make the container behave as if it was app (because it would run app with anything you passed in on the commandline as arguments). If you later wanted to use this image as a base for another image, you could still access app.

    The second example will run a bit slower since it must extract the zip file each time you docker run and you cannot use app easily if you make this a parent image, since app hasn’t been installed.

    In general I would suggest using the first format, but the second one is fine for trivial zips and throwaway images and containers.

    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.