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:
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"]
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With