2014-08-30 5 views
6

У меня есть локальный файл размером ~ 300 Мб, который я добавляю к изображению докеров. Затем следующее состояние извлекает изображение.Docker как добавить файл без отправки изображения?

Проблема заключается в том, что оператор ADD приводит к фиксации, результатом чего является новый уровень файловой системы, что делает изображение размером ~ 300 Мб больше, чем должно быть.

ADD /files/apache-stratos.zip /opt/apache-stratos.zip 
RUN unzip -q apache-stratos.zip && \ 
    rm apache-stratos.zip && \ 
    mv apache-stratos-* apache-stratos 

Вопрос: Есть ли обходные для ADD локальных файлов, не вызывая коммита?

Одним из вариантов является запуск простой веб-сервер (например, python -m SimpleHTTPServer) перед началом Docker сборки, а затем с помощью wget для извлечения файла, но, кажется, немного грязный:

RUN wget http://localhost:8000/apache-stratos.zip && \ 
    unzip -q apache-stratos.zip && \ 
    rm apache-stratos.zip && \ 
    mv apache-stratos-* apache-stratos 

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

ответ

13

В соответствии с the documentation, если вы передадите файл архива из локальной файловой системы (а не URL-адреса) в ADD в файле Docker (с целевым путем, а не по пути + имя файла), он распакует файл в указанный каталог ,

< Если ЦСИ> является локальным архив дегтя в признанном формате сжатия (идентичности, GZIP, bzip2 или XZ), то он распечатывается как каталог. Ресурсы от удаленных URL-адресов не распаковываются. Когда каталог скопированы или распакованы, он имеет такое же поведение, как деготь -x: результат объединение:

1) Независимо существовали на пути назначения и 2) Содержание дерева источника, с конфликтами, разрешенными в пользу «2.» по-умолчанию.

попробовать:

ADD /files/apache-stratos.zip /opt/ 

и посмотреть, если файлы есть, без дальнейшей декомпрессии.

+8

Кажется, не распаковывает '.zip' файл на Docker 1.2.0. –

+0

«Если [src] является локальным tar-архивом в распознанном формате сжатия (identity, gzip, bzip2 или xz), он распаковывается как каталог». –

+0

Факт ADD, не поддерживающий поддержку файлов '.zip', по-видимому, является предполагаемым решением: https://github.com/docker/docker/issues/15036 – jap1968

2

Вы можете использовать docker-squash для сквоша вновь созданных слоев. Это должно значительно уменьшить размер изображения.

К сожалению, упомянутые обходные пути (RUN curl ... && unzip ... & rm ..., распаковка при запуске контейнера) являются единственными вариантами на данный момент (докер 1.11).