Каталог venv не создается внутри Docker container / image - PullRequest
0 голосов
/ 13 февраля 2020

Я относительно новичок в Docker и, в качестве эксперимента, я пытаюсь создать просто универсальный c Django контейнер разработки со следующим 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

Изображение кажется чтобы построить нормально, но когда я go запускаю контейнер:

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

Мой локальный монтированный файл, / home / me / dev / djangoRESTreact / code, не заполняется ожидаемым каталогом venv djangoProject из этого Dockerfile и смонтировать. Контейнер docker также имеет пустой каталог в / code. Если я запускаю python3 -m venv djangoProject непосредственно внутри контейнера, создается каталог venv, и я вижу его как на хосте, так и внутри контейнера.

Любая идея, почему мой venv не создается в изображение и последующий контейнер?

Я вырываю волосы.

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 13 февраля 2020

Вам вообще не нужны венвы в Docker контейнере, поэтому не беспокойтесь о них.

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

Однако, чтобы ответить на ваш вопрос, вы не понимаете, как -v монтирует работу; они монтируют вещи с вашего хоста в каталог в контейнере. /code/..., созданный в вашем докер-файле, по существу перекрывается монтированием тома, поэтому вы вообще не видите venv.

1 голос
/ 13 февраля 2020

Когда вы монтируете том в контейнер, он покрывает все, что уже было в контейнере в этом месте. Это точно так же, как и любое другое крепление на Linux. Кроме того, тома монтируются только при сборке контейнеров, а не при их запуске. Таким образом, venv, который вы помещаете в это место во время строительства, не виден без запуска. Если вы хотите, чтобы ваш вен был видимым, вам нужно поместить его в том, а не просто в контейнер в том же месте.

0 голосов
/ 13 февраля 2020

Монтирование тома с помощью -v приводит к установке /home/me/dev/djangoRESTreact/code на хосте в /code в контейнере. Он монтируется над всем, что было там размещено во время сборки (ваш venv).

Если вы запустите контейнер без флага -v, вы, вероятно, обнаружите, что каталог venv существует.

Вам, вероятно, следует избегать создания venv внутри контейнера, поскольку это изолированная среда ,

Вместо этого просто скопируйте файл needs.txt в контейнер и установите их непосредственно в контейнере. Что-то вроде:

COPY ./requirements.txt /requirements.txt
RUN pip install -U pip && pip install -r /requirements.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...