Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

docker

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"]
like image 573
Owen Avatar asked Apr 25 '14 17:04

Owen


1 Answers

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.

like image 168
Andy Avatar answered Oct 18 '22 19:10

Andy