При построении на Docker Hub игнорируется контекстный путь при копировании файлов

#django #docker #dockerhub

Вопрос:

Я пытаюсь загрузить приложение 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 )" amp;amp; 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....
 

Но, Докер Хаб:

     Step 5/7 : COPY . .
---> 852fa937cb0a
Step 6/7 : RUN file="$(ls -1 )" amp;amp; 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
 

приложение/Докерфайл

 FROM python:3.8.3-alpine

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

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

докер-композитор.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
 

Структура проекта:

Структура img_

ОБНОВЛЕНИЕ: Докер строится с Github. Файл requirements.txt находится в репозитории GitHub (папка приложения), но по какой-то причине во время сборки Docker Hub копирует файлы из корневой папки проекта, а не содержимое папки приложения.

Github:
https://github.com/sigalglebru/django-на-докере

Комментарии:

1. Как вы запускаете или запускаете дело «Docker Hub»?

2. Можете ли вы поделиться с нами фактическим репозиторием github?

3. @larsks Github: github.com/sigalglebru/django-on-docker .

4. @DavidMaze Докер покупает с Github. Файл requirements.txt находится в репозитории GitHub (папка приложения), но по какой-то причине во время сборки Docker Hub копирует файлы из корневой папки проекта, а не содержимое папки приложения

Ответ №1:

Проблема в том, что вам нужно сообщить Docker Hub, где найти контекст сборки.

Когда вы запускаетесь docker-compose build локально, docker-compose считывает ваш docker-compose.yml файл и знает, что нужно создавать внутри app каталога, потому что вы явно задали контекст сборки:

 build:
  context: app
  dockerfile: Dockerfile
 

При сборке в Docker Hub по умолчанию предполагается
, что контекст сборки является верхним уровнем вашего репозитория. Если вы зададите путь к
своему Dockerfile , например, app/Dockerfile , это эквивалентно
запуску:

 docker build -f app/Dockerfile .
 

Если вы попробуете это сделать, вы увидите, что потерпите неудачу таким же образом. Вместо того , чтобы задавать
путь к Dockerfile каталогу, вам нужно задать путь к контексту сборки
в app каталоге. Например:

введите описание изображения здесь

(Посмотрите на столбец «Контекст сборки»).

При правильной настройке ваш репозиторий создается на Docker Hub без ошибок.

Ответ №2:

Спасибо, я нашел решение:

Я просто скопировал файлы из./app на подключенный том и немного изменил контекст, но все еще не понимаю, почему это нормально работало на локальной машине

Докерфайл:

 FROM python:3.8.3-alpine

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /code
COPY ./app .

RUN pip install -r requirements.txt
 

докер-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"