在Docker容器/映像中未创建venv目录

时间:2020-02-13 20:28:23

标签: python docker dockerfile

我对Docker相对陌生,作为一个实验,我试图使用以下Dockerfile创建一个通用的Django开发容器:

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

图像似乎可以建立,但是当我去运行容器时:

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

我的本​​地挂载/ home / me / dev / djangoRESTreact / code未填充我从该Dockerfile和挂载中期望的djangoProject venv目录。 docker容器在/ code处还有一个空目录。如果我直接在容器内运行python3 -m venv djangoProject,则会创建venv目录,并且可以在主机上和容器内看到它。

您知道为什么未在映像和后续容器中创建我的虚拟货币吗?

我正在拔头发。

谢谢!

3 个答案:

答案 0 :(得分:4)

您根本不需要在Docker容器中使用venvs,因此不必打扰。

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挂载的工作方式;他们将您主机上的东西挂载到容器中的目录中。在dockerfile中创建的/code/...实际上被卷装载覆盖,这就是为什么您根本看不到venv的原因。

答案 1 :(得分:1)

将卷装入容器时,该卷将覆盖该位置容器中已经存在的所有内容。这与Linux上其他所有挂载的工作方式完全相同。同样,仅在构建容器时才安装卷,而在运行它们时才安装。因此,在构建时放置在该位置的venv如果不运行就不可见。如果想让您的静脉可见,则需要将其放入容器中,而不仅仅是放在同一位置的容器中。

答案 2 :(得分:0)

使用-v挂载卷会使主机上的/home/me/dev/djangoRESTreact/code挂载在容器中的/code处。它会覆盖构建期间放置在此处的所有内容(您的venv)。

如果运行不带-v标志的容器,您可能会发现venv目录存在。

您可能应该避免在容器内创建venv,因为它是一个隔离的环境。

相反,只需将您的requirements.txt复制到容器中,然后直接将其安装在容器中。像这样:

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