Initially I created a Dockerfile
to run my django app. I chose python alpine to save on image size.
There were a few issues with that but that is fixed in the below Dockerfile
FROM python:3.8-alpine
RUN mkdir -p /code/requirements
WORKDIR /code
RUN pip install --upgrade pip --no-cache-dir
# Installing requirements.txt from project
COPY ./requirements/*.txt /code/requirements/.
RUN apk add --no-cache --virtual .build-deps gcc libffi-dev openssl-dev musl-dev mariadb-dev \
&& pip install --no-cache-dir -r /code/requirements/production.txt \
&& apk del .build-deps gcc libffi-dev musl-dev openssl-dev mariadb-dev
COPY . /code/
# Give access to non root user
RUN rm -rf /code/.git* && \
chown -R 1001 /code && \
chgrp -R 0 /code && \
chmod -R g+w /code
USER 1001
EXPOSE 8000
CMD ["sh", "-c", "python manage.py collectstatic --no-input; python manage.py migrate; python manage.py runserver 0.0.0.0:8000"]
The image size is a whopping 536MB
REPOSITORY TAG IMAGE ID CREATED SIZE
trademate-app latest c68e2e23464f 40 seconds ago 536MB
After checking the history:
$ docker history trademate-app
IMAGE CREATED CREATED BY SIZE COMMENT
6f2ed6c9d629 About a minute ago /bin/sh -c #(nop) CMD ["sh" "-c" "python ma… 0B
da5c27376179 About a minute ago /bin/sh -c #(nop) EXPOSE 8000 0B
49e374f1bd68 About a minute ago /bin/sh -c #(nop) USER 1001 0B
f705cd2c2415 About a minute ago /bin/sh -c rm -rf /code/.git* && chown -… 189MB
d48349f175fa 2 minutes ago /bin/sh -c #(nop) COPY dir:47dc9677cabb09e63… 193MB
848177bf54b2 2 minutes ago /bin/sh -c apk add --no-cache --virtual .bui… 37.9MB
b5ab3803fe68 8 minutes ago /bin/sh -c #(nop) COPY file:7b8d1a2c6c47119d… 215B
ffe7a4e57a38 8 minutes ago /bin/sh -c pip install --upgrade pip --no-ca… 5.03MB
d7e45c46def5 8 minutes ago /bin/sh -c #(nop) WORKDIR /code 0B
8278e34b58a3 8 minutes ago /bin/sh -c mkdir -p /code/requirements 0B
204216b3821e 2 months ago /bin/sh -c #(nop) CMD ["python3"] 0B
<missing> 2 months ago /bin/sh -c set -ex; wget -O get-pip.py "$P… 6.24MB
<missing> 2 months ago /bin/sh -c #(nop) ENV PYTHON_GET_PIP_SHA256… 0B
<missing> 2 months ago /bin/sh -c #(nop) ENV PYTHON_GET_PIP_URL=ht… 0B
<missing> 2 months ago /bin/sh -c #(nop) ENV PYTHON_PIP_VERSION=19… 0B
<missing> 2 months ago /bin/sh -c cd /usr/local/bin && ln -s idle3… 32B
<missing> 2 months ago /bin/sh -c set -ex && apk add --no-cache --… 98.6MB
<missing> 2 months ago /bin/sh -c #(nop) ENV PYTHON_VERSION=3.8.0 0B
<missing> 2 months ago /bin/sh -c #(nop) ENV GPG_KEY=E3FF2839C048B… 0B
<missing> 2 months ago /bin/sh -c apk add --no-cache ca-certificates 551kB
<missing> 2 months ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B
<missing> 2 months ago /bin/sh -c #(nop) ENV PATH=/usr/local/bin:/… 0B
<missing> 2 months ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:fe1f09249227e2da2… 5.55MB
So you can see the removal of the git folder and env folder was screwing me along with the copy.
So I added a .dockerignore
file containing:
.git
.cache
.geckodriver.log
.vscode
env/
and removing the rm -rf /code/.git*
command.
The image is now 175 MB
REPOSITORY TAG IMAGE ID CREATED SIZE
trademate-app latest 0040fef600ad 8 minutes ago 175MB
Saving a whopping 361MB
Any other improvements would be welcomed…send me an email.