我对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目录。码头容器在/code上也有一个空目录。如果我直接在容器中运行python3 -m venv djangoProject,就会创建venv目录,并且我可以在主机和容器中看到它。
知道为什么没有在映像和后续容器中创建我的venv吗?
我要把头发拔出来。
提前感谢!
发布于 2020-02-13 20:30:35
你根本不需要码头集装箱里的文号,所以不要费心去做一个。
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。
发布于 2020-02-13 20:33:20
当您将卷挂载到容器中时,卷将覆盖该位置的容器中的任何内容。这与Linux上所有其他挂载的工作方式完全相同。此外,只有在建造容器时才安装卷,而不是在运行容器时。因此,您在构建时放置在该位置的venv在不运行时是不可见的。如果您想要您的at是可见的,那么您需要把它放在卷,而不只是在同一地点的容器。
发布于 2020-02-13 20:45:43
用-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.txthttps://stackoverflow.com/questions/60215951
复制相似问题