Docker-compose и .dockerignore

Есть небольшая конфигурация docker-compose с файлами Dockerfiles и .dockerignore, которые у меня есть в подкаталогах. Я не могу понять, почему мои изображения после сборки включают все, даже если у меня есть некоторые элементы, которые нужно игнорировать в .dockerignore. Вот что у меня есть

docker-compose.yml
docker
├── app
│   ├── Dockerfile
│   └── .dockerignore
└── web
    ├── Dockerfile
    ├── nginx.conf
    └── .dockerignore

Пример .dockerignore:

**/.dockerignore
docker-compose.yml
log
**/log
../../log

Я просто запускаю это следующим образом:

docker-compose up -d --build --no-cache

Ничего из вышеперечисленного не игнорируется .. Что я делаю не так?

docker-compose version 1.23.2, build 1110ad01

Добавление Dockerfile для службы приложений (см. Docker-compose). Docker-compose упаковывает два образа с приложением ROR и nginx. Для обоих файлов докеров у меня есть dockerignore. Насколько я понимаю, я могу сказать, что именно хочу в каждом из них. Но это не так. Как я могу игнорировать некоторые файлы в пакете? Или мне следует поместить свои Dockerfile и dockerignore по разным путям, поскольку сборка работает только внутри контекста .. Я запутался.

FROM ruby:2.4.1
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs imagemagick
# Configuring main directory
RUN mkdir -p /var/www/example.com
WORKDIR /var/www/example.com
# Setting env up
ENV RAILS_ENV='production'
ENV RACK_ENV='production'

# Adding gems
COPY Gemfile Gemfile
COPY Gemfile.lock Gemfile.lock
RUN bundle install --jobs 20 --retry 5 --without development test
# Adding project files
COPY . .

EXPOSE 3000
CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]

Я подумал, что COPY . . сначала проверяет .dockerignore .. нет?

Попробуйте * вместо **. Я думаю, что ** не работает в .dockerignore. Кроме того, что именно есть в ваших изображениях, которые вы хотите исключить?

amorfis 27.12.2018 14:37

Фактическое содержимое файла docker-compose.yml кажется важным для отладки этого; увидеть два Dockerfile тоже не повредит. Если вы используете Docker bind mounts (volumes:) для замены всего в образе вашим локальным деревом исходных текстов, это не касается файлов .dockerignore.

David Maze 27.12.2018 15:14

Сборка должна игнорировать эти файлы, поэтому вам нужно предоставить минимальный воспроизводимый пример, чтобы получить помощь по этому поводу. Ваши примеры неполны и не сведены к минимуму, необходимому для того, чтобы кто-то еще мог попытаться воспроизвести проблему.

BMitch 27.12.2018 20:39
docker-compose, по-видимому, долгое время неправильно обращался с .dockerignore или вообще не обращался с ним целую вечность; см. например # 1607, # 3886. Если возникнут проблемы, обязательно обновитесь до последней версии ... и молитесь. : /
Raphael 29.03.2019 11:08
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
16
4
29 313
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

У вас есть 2 Dockerfiles, у которых есть свои отдельные контексты. В каждом контексте (папке) у вас есть .dockerignore, и это правильно. Но .dockerignoreне работает вне контекста сборки, это означает, что использовать ../../ неправильно.

Я предполагаю, что вы предполагаете, что эти файлы относятся к папке docker, но на самом деле они применимы к docker/app и docker/web соответственно.

Процесс сборки следующий:

Сначала docker cli упаковывает контекст (папку с Dockerfile, если не указан явно) и отправляет его в docker daemon. Ничего за пределами в эту папку не отправляется. Он написан специально для команды COPY, которая используется для помещения элементов контекста в контейнер:

The src path must be inside the context of the build; you cannot COPY ../something /something, because the first step of a docker build is to send the context directory (and subdirectories) to the docker daemon.

Если есть .dockerignore, игнорируемые файлы исключены перед упаковкой.

Спасибо за внимание. Можете ли вы проверить файл докеров выше. Все еще не ясно.

Evgeny 27.12.2018 17:43

.dockerignore должен находиться в корневом каталоге / папке контекста, как вы указали в docker-compose.yml.

Что сработало для меня, так это поместить .dockerignore в корень моего приложения, где находится docker-compose.yml.

Другие вопросы по теме