Где поставить .dockerignore? - PullRequest
1 голос
/ 17 марта 2020

Рассмотрим следующую типичную python структуру проекта:

fooproject 
  - main.py
  - src/
  - test/
  - logs/
  - Dockerfile
  - .dockerignore
  - README.md

.dockerfile должен предотвращать включение каталогов test/ и logs/ в образ docker.

test/
logs/

Содержимое Dockerfile равно

FROM ubuntu16.04

COPY . /app/
WORKDIR /app    
USER root    
RUN pip install -r requirements.txt    
ENTRYPOINT ["main.py"]

Однако при запуске через автоматическую интеграцию c docker PyCharm каталоги test и logs копируются в контейнер. Команда запуска PyCharm завершается следующим образом:

7eb643d9785b:python -u /opt/project/main.py 

Я пробовал несколько вещей безрезультатно, например, создание дубликата копии .dockerignore в каталоге над остальной частью приложения. Например:

COPY . /app/
COPY .dockerignore .dockerignore
WORKDIR /app

Хотите знать, возможно ли, что PyCharm /opt/project как-то мешает? Итак, где именно .dockerignore должен быть в таком проекте?

Обновление

Я поделился выводом docker container inspect с BMitch, и он смог найти решение. PyCharm автоматически монтировал том в настройках контейнера запустите config

enter image description here

1 Ответ

2 голосов
/ 17 марта 2020

.dockerignore используется для управления тем, какие файлы включены в контекст сборки. Это влияет на команды COPY и ADD в Dockerfile и, в конечном итоге, на итоговое изображение. Когда вы запускаете этот образ с монтированием тома, например:

        {
            "Type": "bind",
            "Source": "/home/adam/Desktop/Dev/ec2-data-analysis/grimlock",
            "Destination": "/opt/project",
            "Mode": "rw",
            "RW": true,
            "Propagation": "rprivate"
        },

Это монтирование тома переопределяет содержимое образа для этого контейнера. Весь доступ к пути будет go к каталогу вашего рабочего стола, а не к содержимому образа, а Linux bind mounts не будет иметь понятия файла .dockerignore.

Когда вы запускаете этот образ без при монтировании тома вы должны увидеть другое поведение.


Для любого, кто столкнется с этим вопросом в будущем, .dockerignore должен находиться в root вашего контекста сборки. Контекст сборки - это каталог, который вы передаете в конце команды сборки, часто . или текущий каталог. Если вы включите BuildKit, он сначала проверит наличие Dockerfile.dockerignore, где можно изменить путь / имя Dockerfile. И чтобы проверить свой .dockerignore, см. этот ответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...