2014-09-17 4 views
5

Я пытаюсь запустить небольшое приложение Rails в контейнере докера. Я приближаюсь, но я борюсь с файлом Dockerfile.Добавление папки проекта, за исключением файла Docker

Я добавил в свой файл Docker следующую команду для рекурсивного добавления всех файлов в папку проекта.

ADD . 

После этого я бегу

RUN bundle install --deployment 

Однако, поскольку моя ADD команда также добавляет Dockerfile, это означает, что мой кэш изображений ломает каждый раз, когда я редактирую мой Dockerfile заставляет меня rebundle.

По https://docs.docker.com/reference/builder/#the-dockerignore-file, я могу использовать .dockerignore файл игнорировать Dockerfile, но это приводит к тому, команда docker build на провал с

2014/09/17 22:12:46 Dockerfile was excluded by .dockerignore pattern 'Dockerfile' 

Как я могу легко добавить свой проект к моему образу, но исключает Dockerfile, поэтому я не разбиваю кеш изображения докеров?

ответ

1

Существует проблема для этого на Github: https://github.com/docker/docker/issues/7969

Ваша главная проблема заключается в выселении кэша из-за ADD и модификации Dockerfile. Один из сопровождающих объясняет, что, на данный момент, файл .dockerignore не предназначен для борьбы с ним:

Это - .dockerignore - пропускает некоторые файлы при загрузке контекста от клиента к демону и демон нуждается в Dockerfile для изображение здания. Таким образом, основная идея (на данный момент) .dockerignore пропускает большие dirs для более быстрой загрузки контекста, а не для чистого контекста. full comment on Github

Я боюсь, что кэш изображений будет ломаться, когда вы ADD Dockerfile пока these lines не изменяются.

Может быть, один способ справиться с кэшем, чтобы поместить все файлы, которые вы хотите добавить в другой каталог, чем Dockerfile:

. 
├── Dockerfile 
└── files_to_add/ 

Тогда, если вы ADD files_to_add, не будут включены Dockerfile и кеш не будет выселен.

Но, я не считаю, что это трюк - это решение. Я также хочу, чтобы мой Dockerfile рядом с другими файлами в корне моих проектов.

+0

Реальная проблема здесь не наличие файла, но недействительности кэша докер изображения вызывает расслоение установить снова запустить. Это то, чего я пытаюсь избежать, чтобы ускорить процесс. –

+1

Да, я понимаю вашу точку зрения (на самом деле я сталкиваюсь с той же проблемой). Но кажется, что это еще не возможно с '.dockerignore'file. Один из сопровождающих объясняет, почему в этом вопросе. Более того, полученная вами ошибка определяется [здесь, в источнике кода] (https://github.com/docker/docker/blob/e49c70109228d657790190007c8f9d7c55a25be2/api/client/commands.go#L136-L142). На данный момент я боюсь, что это невозможно. – Kuhess

+1

Я только что изменил ответ, чтобы сосредоточиться на проблеме выселения кеша. – Kuhess

3

Ваше разъяснение в комментарии к ответу от @Kuhess, в котором говорится, что фактическая проблема заключается в «недействительности кеша изображения докера, вызывающего установку пакета для запуска снова», помогает в предоставлении вам ответа.

Я использую файл Docker, который выглядит следующим образом для моих рельсов 4.1. * App. Сначала добавив ADDing Gemfile *, затем запуская установку пакета, и только затем добавив оставшуюся часть приложения, шаг установки пакета будет кэширован, если только один из файлов Gemfile * не изменится.

FROM ruby:2.1.3 

RUN adduser --disabled-password --home=/rails --gecos "" rails 

RUN gem install bundler --no-ri --no-rdoc 
RUN gem install -f rake --no-ri --no-rdoc 

RUN mkdir /myapp 
WORKDIR /myapp 

ADD Gemfile /myapp/Gemfile 
ADD Gemfile.lock /myapp/Gemfile.lock 
RUN bundle install 

ADD . /myapp 

RUN chown -R rails:rails /myapp 

USER rails 
EXPOSE 3000 
ENV RAILS_ENV production 
CMD bundle exec rails server -p 3000 

Мой Dockerfile находится в корневой директории с приложением, но изменения к нему (или любой другой части приложения) не вызывают кэш изображений для расслоении установки сломать, потому что они будут добавлены после его RUN , Единственное, что его нарушает, это изменения в Gemfile *, что является правильным.

FYI, мой .dockerignore файл выглядит следующим образом:

.git 
log 
vendor/bundle 
+0

+1 для части adduser, поэтому многие докеры-файлы на основе корней – gertas

Смежные вопросы