How to translate docker-compose.yml to Dockerfile
TL;DR
You can pass some informations to your Dockefile
(the command to run) but that wouldn't be equivalent and you can't do that with all the docker-compose.yml
file content.
You can replace your docker-compose.yml
file with commands lines though (as docker-compose
is precisely to replace it).
In your case you can add the command to run to your Dockerfile
as a default command (which isn't roughly the same as passing it to containers you start at runtime) :
CMD ["python", "jk/manage.py", "runserver", "0.0.0.0:8081"]
or pass this command directly in command line like the volume and port which should give something like :
docker run -d -v .:/code -p 8081:8080 yourimage python jk/manage.py runserver 0.0.0.0:8081
BUT
Keep in mind that Dockerfiles
and docker-compose
serve two whole different purposes.
Dockerfile
are meant for image building, to define the steps to build your images.docker-compose
is a tool to start and orchestrate containers to build your applications (you can add some informations like the build context path or the name for the images you'd need, but not the Dockerfile content itself).
So asking to "convert a docker-compose.yml file
into a Dockerfile
" isn't really relevant.
That's more about converting a docker-compose.yml
file into one (or several) command line(s) to start containers by hand.
The purpose of docker-compose
is precisely to get rid of these command lines to make things simpler (it automates it).
also :
From the manage.py documentation:
DO NOT USE THIS SERVER IN A PRODUCTION SETTING. It has not gone through security audits or performance tests. (And that’s how it’s gonna stay.
Django's runserver
included in the manage.py
tool isn't meant for production.
You might want to consider using a WSGI server behind a proxy.
user2156115
Updated on July 19, 2022Comments
-
user2156115 almost 2 years
I have an application written in Django and I am trying to run it in docker on Digital Ocean droplet. Currently I have two files.
Can anybody advise how to get rid of
docker-compose.yml
file and integrate all the commands withinDockerfile
???Dockerfile
FROM python:3 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code COPY . /code/ RUN pip install -r reqirements.txt RUN python /code/jk/manage.py collectstatic --noinput
docker-compose.yml
version: '3' services: web: build: . command: python jk/manage.py runserver 0.0.0.0:8081 volumes: - .:/code ports: - "8081:8081"
I run my application and docker image like following:
docker-compose run web python jk/manage.py migrate
docker-compose up
output:
Starting workspace_web_1 ... Starting workspace_web_1 ... done Attaching to workspace_web_1 web_1 | Performing system checks... web_1 | web_1 | System check identified no issues (0 silenced). web_1 | December 02, 2017 - 09:20:51 web_1 | Django version 1.11.3, using settings 'jk.settings' web_1 | Starting development server at http://0.0.0.0:8081/ web_1 | Quit the server with CONTROL-C. ...
Ok so I have take the following approach: Dockerfile
FROM python:3 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code COPY . /code/ RUN pip install -r reqirements.txt RUN python /code/jk/manage.py collectstatic --noinput
then I ran:
docker build -t "django:v1" .
So
docker images -a
throws:docker images -a REPOSITORY TAG IMAGE ID CREATED SIZE django v1 b3dec6aaf9b9 5 minutes ago 949MB <none> <none> 55370397f7f2 5 minutes ago 948MB <none> <none> e7eba7113203 7 minutes ago 693MB <none> <none> dc3d7705c45a 7 minutes ago 691MB <none> <none> 12825382746d 7 minutes ago 691MB <none> <none> 2304087e8b82 7 minutes ago 691MB python 3 79e1dc9af1c1 3 weeks ago 691MB
And finally I ran:
cd /opt/workspace docker run -d -v /opt/workspace:/code -p 8081:8081 django:v1 python jk/manage.py runserver 0.0.0.0:8081
Two simple questions:
- do i get it right that each
<none>
listed image is created when runningdocker build -t "django:v1" .
command to build up my image ... So it means that it consumes like[(691 x 4) + (693 x 1) + (948) + (949)]MB
of disk space ?? - Is it better to use gunicorn or wsgi program to run django in production ?
And responses from @vmonteco:
- I think so, but a way to reduce the size taken by your images is to reduce their number by using a single RUN directive for several chained commands in your Dockerfile. (RUN cmd1 && cmd2 rather than RUN cmd1 then RUN cmd
- It's up to you to make your own opinion. I personnally use uWSGI but there even are other choices than gunicorn/uwsgi (Not just "wsgi", that's the name of a specification for interface, not a programm). Have fun finding your prefered one! :)