在 Docker 上构建 Hub 在复制文件时忽略上下文路径

Building on Docker Hub ignores context path when copying files

我正在尝试将 Django 应用程序上传到 Docker Hub。在本地计算机 (Ubuntu 18.04) 上一切正常,但在 Docker Hub 上存在无法找到 requirements.txt 文件的问题。

本地机器:

sudo docker-compose build --no-cache

结果(还可以):

Step 5/7 : COPY . .
 ---> 5542d55caeae
Step 6/7 : RUN file="$(ls -1 )" && echo $file
 ---> Running in b85a55aa2640
Dockerfile db.sqlite3 hello_django manage.py requirements.txt venv
Removing intermediate container b85a55aa2640
 ---> 532e91546d41
Step 7/7 : RUN pip install -r requirements.txt
 ---> Running in e940ebf96023
Collecting Django==3.2.2....

但是,Docker 中心:

    Step 5/7 : COPY . .
---> 852fa937cb0a
Step 6/7 : RUN file="$(ls -1 )" && echo $file
---> Running in 281d9580d608
README.md app config docker-compose.yml
Removing intermediate container 281d9580d608
---> 99eaafb1a55d
Step 7/7 : RUN pip install -r requirements.txt
---> Running in d0e180d83772
[91mERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'
Removing intermediate container d0e180d83772
The command '/bin/sh -c pip install -r requirements.txt' returned a non-zero code: 1

app/Dockerfile

FROM python:3.8.3-alpine

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /code
COPY . .
RUN file="$(ls -1 )" && echo $file
RUN pip install -r requirements.txt

docker-composer.yml

version: '3'
    services:
      web:
          build:
            context: app
            dockerfile: Dockerfile
          volumes:
            - ./app/:/code/
          ports:
            - "8000:8000"
          env_file:
            - ./config/.env.dev
          command: python manage.py runserver 0.0.0.0:8000

项目结构:

更新: Docker 正在从 Github 构建。 文件 requirements.txt 位于 GitHub 存储库(app 文件夹)中,但由于某些原因在构建期间 Docker Hub 从项目根文件夹复制文件而不是 app 文件夹的内容。

Github: https://github.com/sigalglebru/django-on-docker

谢谢,我找到了解决方案:

我只是将文件从./app 复制到挂载的卷,几乎没有改变上下文,但仍然不明白为什么它在本地机器上运行良好

Dockerfile:

FROM python:3.8.3-alpine

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /code
COPY ./app .

RUN pip install -r requirements.txt

docker-compose.yml

version: "3.6"
services:
  python:
    restart: always
    build:
      context: .
      dockerfile: docker/Dockerfile
    expose:
      - 8000
    ports:
      - 8000:8000
    command: "python manage.py runserver 0.0.0.0:8000"

问题是您需要告诉 Docker Hub 在哪里可以找到您的构建上下文。

当你 运行 docker-compose build 在本地时,docker-compose 读取你的 docker-compose.yml 文件并知道在 app 目录中构建,因为你已经明确设置构建上下文:

build:
  context: app
  dockerfile: Dockerfile

当您在 Docker Hub 上构建时,默认情况下它将采用构建 上下文是您存储库的顶层。如果您将路径设置为 例如,您的 Dockerfileapp/Dockerfile,这相当于 运行宁:

docker build -f app/Dockerfile .

如果你尝试这样做,你会看到是否以同样的方式失败。而不是设置 Dockerfile的路径,你需要设置构建的路径 app 目录的上下文。例如:

(查看“构建上下文”列)。

如果配置正确,您的存储库将在 Docker Hub 上构建而不会出现错误。