【问题标题】:Docker run application in a volumeDocker 在卷中运行应用程序
【发布时间】:2023-03-16 16:55:01
【问题描述】:

在我的 django docker 应用程序中,我会使用一个卷来管理我的应用程序文件,这里是我的 Dockerfile:

FROM python:3.6-alpine
EXPOSE 8000
RUN apk update
RUN apk add --no-cache make linux-headers libffi-dev jpeg-dev zlib-dev
RUN apk add postgresql-dev gcc python3-dev musl-dev

VOLUME /var/lib/cathstudio/data
WORKDIR /var/lib/cathstudio/data

COPY ./requirements.txt .

RUN pip install --upgrade pip
RUN pip install -t /var/lib/cathstudio/data -r requirements.txt
ENV PYTHONUNBUFFERED 1
ENV PYTHONPATH /var/lib/cathstudio/data

COPY . /var/lib/cathstudio/data

ENTRYPOINT python /var/lib/cathstudio/data/manage.py runserver 0.0.0.0:8000

但是当我运行我的应用程序时:

docker run -d -it --rm --link postgres:postgres --name=cathstudio myrepo/app_studio:latest

我明白了

python: 无法打开文件 '/var/lib/cathstudio/data/manage.py': [Errno 2] 没有这样的文件或目录

如果我在我的 Dockerfile 中只写 ENTRYPOINT python manage.py runserver 0.0.0.0:8000 也是一样的

我的文件哪里错了?如何使用存储应用文件的卷来运行我的应用?

提前非常感谢

【问题讨论】:

  • 您是否尝试在 dockerfile 中运行 ls 命令来检查文件是否确实存在?
  • 为什么要多次从当前目录复制文件?
  • 你已经设置了WORKDIR然后你需要运行ENTRYPOINT python manage.py runserver 0.0.0.0:8000它应该工作如果文件存在。
  • 我尝试但我得到:python:无法打开文件'manage.py':[Errno 2]没有这样的文件或目录

标签: python django docker dockerfile


【解决方案1】:

你可以尝试使用 -v 标志而不是在 dockerfile 中使用 VOLUME 吗,我不知道为什么,但是 VOLUME 会创建确切的空卷,而不是与所有数据一起安装:

从 docker 文件中删除 VOLUME 部分并尝试以下操作

docker run -d -it --rm -v /var/lib/cathstudio/data/:/var/lib/cathstudio/data --link postgres:postgres --name=cathstudio myrepo/app_studio:latest

【讨论】:

  • 你确定吗? touch hello.txt && echo -e "FROM busybox \n VOLUME /var/lib/cathstudio/data\n WORKDIR /var/lib/cathstudio/data\n COPY hello.txt .\n RUN cat hello.txt" > Dockerfile && docker build -t test . && docker run --rm test sh -c "ls" 输出hello.txt
  • 我更喜欢不要在 docker run 命令中使用 -v,因为我不想将我的 docker 映像分发给公众,并且需要尽可能地自动化更多的思考。我会在 dockerfile 内部创建和管理卷。谢谢
【解决方案2】:

卷不用于保存代码。特别是考虑到您对@i4nk1t 的回答(“我想分发我的 Docker 映像”)的评论,代码应该在映像本身中,而不是在卷中。

您应该删除VOLUME 行。

Declaring VOLUME in a Dockerfile 有一些关键的副作用。其中之一是它可以防止该目录上的任何RUN 命令对未来产生任何影响,从而使您的应用程序无法正常工作。

我倾向于推荐一种工作流程,您可以确保您的应用程序在本地工作,然后将其打包到 Docker 中。如果您不能使用您的主机 Python 并且确实必须在容器环境中进行实时开发,您可以使用 docker run -v 选项(或等效选项)将主机内容挂载到任何容器中的任何目录,无论是否它被声明为VOLUME

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多