'RUN pip install -r requirements.txt' 不起作用

Aar*_*shi 2 python docker dockerfile

我是 Docker 的新手,并尝试使用相同的方式部署 django 项目。但是在构建 docker-compose 之后,我收到了这个错误:

错误:无法打开需求文件:[Errno 2] 没有这样的文件或目录:'requirements.txt' 错误:服务 'web' 无法构建:命令 '/bin/sh -c pip install -r requirements.txt'返回非零代码:1

我可能在设置正确的路径时搞砸了,所以这是我的项目结构

~/Desktop/Projects/ToDoApp
   ToDoApp
     settings.py
   docker-compose.yml
   Dockerfile
   manage.py
   requirements.txt
Run Code Online (Sandbox Code Playgroud)

这是我的 dockerfile

#pull official base image
FROM python:3

#set envionment variables
ENV PYTHONUNBUFFERED 1

# Adding requirements file
ADD requirements.txt ToDoApp/ToDoApp

#set work directory
WORKDIR /ToDoApp

#install dependencies
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

CMD ["python", "./ToDoApp/manage.py runserver 0.0.0.0:8000"]
Run Code Online (Sandbox Code Playgroud)

这是我的 docker-compose.yml

version: '3'

services:
  web:
    build: .
    command: python /ToDoApp/manage.py runserver 0.0.0.0:8000
    volumes:
        - .:/Desktop/Projects/ToDoApp
    ports:
        - "8000:8000"
    environment:
      - SECRET_KEY = please_change_me
Run Code Online (Sandbox Code Playgroud)

BMi*_*tch 7

我看到的几个问题:

  • 您使用的 ADD 命令会创建一个名为 的文件ToDoApp/ToDoApp,它甚至不会创建子目录。
  • 不需要 ADD(您不是提取 tar 或从 URL 下载),以便可以切换到 COPY。
  • 你需要复制你的代码。
  • 可以重新排序 RUN 命令以提高缓存效率。
  • 正确使用相对路径和 WORKDIR。
  • 使用json语法时需要将args分开

生成的 Dockerfile 如下所示:

FROM python:3

#set envionment variables
ENV PYTHONUNBUFFERED 1

# run this before copying requirements for cache efficiency
RUN pip install --upgrade pip

#set work directory early so remaining paths can be relative
WORKDIR /ToDoApp

# Adding requirements file to current directory
# just this file first to cache the pip install step when code changes
COPY requirements.txt .

#install dependencies
RUN pip install -r requirements.txt

# copy code itself from context to image
COPY . .

# run from working directory, and separate args in the json syntax
CMD ["python", "./manage.py", "runserver", "0.0.0.0:8000"]
Run Code Online (Sandbox Code Playgroud)