Добавление утилит Linux в образ докера на основе busybox - PullRequest
0 голосов
/ 09 января 2019

Когда я пытаюсь df -h для контейнера busybox, я получаю следующие результаты:

$ docker run -it busybox du -h  
# expected results

Что мне нужно, так это вывод df -b, который дает мне следующее:

$ docker run -it busybox du -b                                                                     
du: invalid option -- b
BusyBox v1.30.0 (2018-12-31 18:16:17 UTC) multi-call binary.

Usage: du [-aHLdclsxhmk] [FILE]...

Summarize disk space used for each FILE and/or directory

    -a  Show file sizes too
    -L  Follow all symlinks
    -H  Follow symlinks on command line
    -d N    Limit output to directories (and files with -a) of depth < N
    -c  Show grand total
    -l  Count sizes many times if hard linked
    -s  Display only a total for each argument
    -x  Skip directories on different filesystems
    -h  Sizes in human readable format (e.g., 1K 243M 2G)
    -m  Sizes in megabytes
    -k  Sizes in kilobytes (default)

Поскольку многие стандартные утилиты обрезаны на изображении busybox или не существуют, поведение неудивительно. На странице занятого dockerhub предлагает :

FROM busybox
COPY ./my-static-binary /my-static-binary
CMD ["/my-static-binary"]

Итак, я создал Dockerfile со следующим содержимым, пытаясь скопировать мой двоичный файл Ubuntu 16.04 du в образ:

FROM busybox
COPY /usr/bin/du /bin/du
CMD ["/bin/du", "-b"]

Но когда я пытаюсь docker build, я получаю следующую ошибку:

$ docker build .              
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox
 ---> 3a093384ac30
Step 2/3 : COPY /usr/bin/du /bin/du
COPY failed: stat /var/lib/docker/tmp/docker-builder362173879/usr/bin/du: no such file or directory

Я не знаю, является ли это правильным способом добавления утилит к таким минимальным изображениям, но я был бы признателен, если бы вы сообщили мне, каким образом такие утилиты, как (завершено) du, curl и т. Д. быть добавленным, поскольку нет такого менеджера пакетов, как apt.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Если базовый образ just-Busybox Docker не соответствует вашим потребностям, вы можете изменить свой Dockerfile, чтобы он основывался на более полнофункциональном дистрибутиве Linux. FROM ubuntu очень распространен и включает в себя GNU-версии набора инструментов Unix (и их различные расширения поставщиков); FROM alpine также распространен и основан на Busybox плюс минимальный менеджер пакетов.

Еще один хороший ответ - ограничиться функциональностью, определенной в POSIX.1 : du (1) не требуется для поддержки опции -b . Это поможет, если вы пытаетесь писать образы на основе Alpine или работаете в системах, которые не являются Linux (MacOS является наиболее ярким современным примером).

Вероятно, вам не удастся скопировать отдельные двоичные файлы из вашей хост-системы в образ Docker, за исключением проблем с путями, поскольку среда библиотеки, вероятно, будет сильно отличаться. Если вы запускаете ldd $(which du) на хосте, все библиотеки, перечисленные там, должны присутствовать в образе и в аналогичной версии. Базовое изображение busybox, вероятно, даже не включает libc.so.6, что является минимальным требованием для большинства динамически связанных двоичных файлов.

Правильный ответ на ваш вопрос в том виде, в котором он написан, - написать многоэтапный Dockerfile, который имеет первый этап с полным набором инструментов C, который создает статическую версию GNU Coreutils , а затем второй этап это копирует это. Это большая работа для инструмента, который, вероятно, не является частью основного приложения, которое вы действительно хотите запустить.

0 голосов
/ 09 января 2019

COPY не работает из-за следующих ограничений:

COPY подчиняется следующим правилам:

Путь должен быть внутри контекста сборки; вы не можете скопировать .. это отправить каталог контекста (и подкаталоги) в докер демон.

Вы можете прочитать больше в Документация Dockerfile .

Чтобы заставить ваш образ busybox работать, вы должны сделать следующее:

  1. скопировать du в каталог, в котором находится ваш Dockerfile: cp /usr/bin/du .
  2. обновите Dockerfile:
FROM busybox
COPY du /du
CMD ["du", "-b"]
3. Перестройте свой образ: `Docker build .`

В соответствии с докертом busybox Документация Вы должны поместить скопированные двоичные файлы непосредственно в / вместо /bin/.

...