StudentDeveloper7
StudentDeveloper7

Reputation: 25

venv directory not being created inside Docker container/image

I am relatively new to Docker and, as an experiment, I am trying to create just a generic Django development container with the following Dockerfile:

FROM python

ENV PYTHONUNBUFFERED 1
RUN apt-get update && apt-get dist-upgrade -y
RUN mkdir /code
WORKDIR /code
RUN python3 -m venv djangoProject
RUN /bin/bash -c "source /code/djangoProject/bin/activate && python3 -m pip install --upgrade pip && pip install django"
EXPOSE 8000

The image seems to build okay, but when I go to run the container:

docker container run -v /home/me/dev/djangoRESTreact/code:/code -it --rm djangodev /bin/bash

My local mount, /home/me/dev/djangoRESTreact/code, is not populated with the djangoProject venv directory I was expecting from this Dockerfile and mount. The docker container also has an empty directory at /code. If I run python3 -m venv djangoProject directly inside the container, the venv directory is created and I can see it both on the host and within the container.

Any idea why my venv is not being created in the image and subsequent container?

I'm pulling my hair out.

Thanks in advance!

Upvotes: 0

Views: 2182

Answers (3)

v25
v25

Reputation: 7621

Mounting the volume with -v causes /home/me/dev/djangoRESTreact/code on the host to be mounted at /code in the container. This mounts over anything that was placed there during the build (your venv).

If you run the container without the -v flag, you'll probably find the venv directory exists.

You should probably avoid creating a venv within the container, as it's an isolated environment.

Instead just copy your requirements.txt into the container, and install them directly in the container. Something like:

COPY ./requirements.txt /requirements.txt
RUN pip install -U pip && pip install -r /requirements.txt

Upvotes: 0

When you mount a volume into a container, the volume covers up anything that was already in the container at that location. This is the exact same way that every other mount on Linux works. Also, volumes are only mounted when building containers, not when running them. Thus, the venv that you put in that location while building isn't visible without running. If you want your venv to be visible, then you need to put it in the volume, not just in the container at the same place.

Upvotes: 2

AKX
AKX

Reputation: 169032

You don't need venvs in a Docker container at all, so don't bother with one.

FROM python
ENV PYTHONUNBUFFERED 1
RUN apt-get update && apt-get dist-upgrade -y
RUN mkdir /code
WORKDIR /code
RUN python3 -m pip install --upgrade pip
RUN python3 -m pip install django
EXPOSE 8000

To answer your question, though, you're misunderstanding how -v mounts work; they mount a thing from your host onto a directory in the container. The /code/... created in your dockerfile is essentially overridden by the volume mount, which is why you don't see the venv at all.

Upvotes: 5

Related Questions