Есть небольшая конфигурация 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 .. нет?
Фактическое содержимое файла docker-compose.yml кажется важным для отладки этого; увидеть два Dockerfile тоже не повредит. Если вы используете Docker bind mounts (volumes:) для замены всего в образе вашим локальным деревом исходных текстов, это не касается файлов .dockerignore.
Сборка должна игнорировать эти файлы, поэтому вам нужно предоставить минимальный воспроизводимый пример, чтобы получить помощь по этому поводу. Ваши примеры неполны и не сведены к минимуму, необходимому для того, чтобы кто-то еще мог попытаться воспроизвести проблему.


У вас есть 2 Dockerfiles, у которых есть свои отдельные контексты. В каждом контексте (папке) у вас есть .dockerignore, и это правильно. Но .dockerignoreне работает вне контекста сборки, это означает, что использовать ../../ неправильно.
Я предполагаю, что вы предполагаете, что эти файлы относятся к папке docker, но на самом деле они применимы к docker/app и docker/web соответственно.
Процесс сборки следующий:
Сначала docker cli упаковывает контекст (папку с Dockerfile, если не указан явно) и отправляет его в docker daemon. Ничего за пределами в эту папку не отправляется. Он написан специально для команды COPY, которая используется для помещения элементов контекста в контейнер:
The
srcpath 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, игнорируемые файлы исключены перед упаковкой.
Спасибо за внимание. Можете ли вы проверить файл докеров выше. Все еще не ясно.
.dockerignore должен находиться в корневом каталоге / папке контекста, как вы указали в docker-compose.yml.
Что сработало для меня, так это поместить .dockerignore в корень моего приложения, где находится docker-compose.yml.
Попробуйте
*вместо**. Я думаю, что**не работает в.dockerignore. Кроме того, что именно есть в ваших изображениях, которые вы хотите исключить?