Old question but you can do a lot to reduce the size of your final image ([`RUN`, `COPY` and `ADD` create layers](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#minimize-the-number-of-layers)). Here's my version, with specific observations as comments: # I would suggest pinning a specific version of the image that you're extending # ubuntu:latest today may not be the same as ubuntu:latest tomorrow FROM ubuntu:18.04 # combining the apt-get update and install RUN instructions removes layers # all packages that you need can be installed in the same RUN (using curl instead of wget) RUN apt-get -qq update -y && \ apt-get -qq install -y \ build-essential \ curl \ libpcre3 \ libpcre3-dev \ nano # WORKDIR will create the directories if they do not already exist # removing the RUN's removes an additional 2 layers WORKDIR /install-files/apache/apr-1.6.5 # combine the curl | tar RUN instructions (note: versions updated) # install apr, expat, apr-utils and httpd in a condensed fashion and purge the installation files # the final image is 374MB without the installation files, 468MB with the installation files RUN curl -L http://mirrors.ukfast.co.uk/sites/ftp.apache.org/apr/apr-1.6.5.tar.gz | tar xvz -C /install-files/apache && \ ./configure && \ make && \ make install && \ rm -rf /install-files/apache/apr-1.6.5 WORKDIR /install-files/apache/expat-2.2.9 RUN curl -L https://github.com/libexpat/libexpat/releases/download/R_2_2_9/expat-2.2.9.tar.gz | tar xvz -C /install-files/apache && \ ./configure && \ make && \ make install && \ rm -rf /install-files/apache/expat-2.2.9 WORKDIR /install-files/apache/apr-util-1.6.1 RUN curl -L http://mirrors.ukfast.co.uk/sites/ftp.apache.org/apr/apr-util-1.6.1.tar.gz | tar xvz -C /install-files/apache && \ ./configure --with-apr=/usr/local/apr/ && \ make && \ make install && \ rm -rf /install-files/apache/apr-util-1.6.1 WORKDIR /install-files/apache/httpd-2.4.41 RUN curl http://mirror.ox.ac.uk/sites/rsync.apache.org//httpd/httpd-2.4.41.tar.gz | tar xvz -C /install-files/apache && \ ./configure --with-apr=/usr/local/apr --with-expat=/usr/local/expat && \ make && \ make install && \ rm -rf /install-files/apache/httpd-2.4.41 WORKDIR / RUN mkdir /tech && \ ln -s /usr/local/apache2/ /tech/httpd # 1. "Although ADD and COPY are functionally similar, generally speaking, COPY is preferred." # https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copy # 2. It's common practice to name the entrypoint script "docker-entrypoint.sh" # 3. would suggest following the principle of least privilege # https://digitalguardian.com/blog/what-principle-least-privilege-polp-best-practice-information-security-and-compliance # COPY preserves file permissions - set them on the host and remove the chmod layer altogether COPY docker-entrypoint.sh /root # finally, our ENTRYPOINT ENTRYPOINT ["/root/docker-entrypoint.sh"]