Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is a good way to add python dependencies to a Docker container?

I am trying to integrate docker in to my django workflow and I have everything set up except one really annoying issue. If I want to add dependencies to my requirements.txt file I basically just have to rebuild the entire container image for those dependencies to stick.

For example, I followed the docker-compose example for django here. the yaml file is set up like this:

db:
  image: postgres
web:
  build: .
  command: python manage.py runserver 0.0.0.0:8000
  volumes:
    - .:/code
  ports:
    - "8000:8000"
  links:
    - db

and the Docker file used to build the web container is set up like this:

FROM python:2.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/

So when the image is built for this container requirements.txt is installed with whatever dependencies are initially in it.

If I am using this as my development environment it becomes very difficult to add any new dependencies to that requirements.txt file because I will have to rebuild the container for the changes in requirements.txt to be installed.

Is there some sort of best practice out there in the django community to deal with this? If not, I would say that docker looks very nice for packaging up an app once it is complete, but is not very good to use as a development environment. It takes a long time to rebuild the container so a lot of time is wasted.

I appreciate any insight . Thanks.

like image 586
Spencer Cooley Avatar asked Jul 05 '15 00:07

Spencer Cooley


People also ask

How do I install Python packages inside docker container?

To install packages in a docker container, the packages should be defined in the Dockerfile. If you want to install packages in the Container, use the RUN statement followed by exact download command . You can update the Dockerfile with latest list of packages at anytime and build again to create new image out of it.

Can I install Python in a docker container?

How to install Python in a Docker Container? It will download the ubuntu images from the docker hub and run the container in the background. You can check it using the docker ps command. Now let's go inside the container using the docker exec command and install python in it.

Which docker image is best for Python?

If you want the absolute latest bugfix version of Python, or a wide variety of versions, the official Docker Python image is your best bet. If you want the absolute latest system packages, you'll want Ubuntu 22.04; RedHat 9 is somewhat more conservative, for example including Python 3.9 rather than 3.10.


2 Answers

You could mount requirements.txt as a volume when using docker run (untested, but you get the gist):

docker run container:tag -v /code/requirements.txt ./requirements.txt

Then you could bundle a script with your container which will run pip install -r requirements.txt before starting your application, and use that as your ENTRYPOINT. I love the custom entrypoint script approach, it lets me do a little extra work without needing to make a new container.

That said, if you're changing your dependencies, you're probably changing your application and you should probably make a new container and tag it with a later version, no? :)

like image 75
2rs2ts Avatar answered Sep 28 '22 13:09

2rs2ts


So I changed the yaml file to this:

db:
  image: postgres
web:
  build: .
  command: sh startup.sh
  volumes:
    - .:/code
  ports:
    - "8000:8000"
  links:
    - db

I made a simple shell script startup.sh:

#!/bin/bash

#restart this script as root, if not already root
[ `whoami` = root ] || exec sudo $0 $*

pip install -r dev-requirements.txt

python manage.py runserver 0.0.0.0:8000

and then made a dev-requirements.txt that is installed by the above shell script as sort of a dependency staging environment.

when I am satisfied with a dependency in dev-requirements.txt I will just move it over to the requirements.txt to be committed to the next build of the image. This gives me flexibility to play with adding and removing dependencies while developing.

like image 28
Spencer Cooley Avatar answered Sep 28 '22 15:09

Spencer Cooley