Как сделать 'docker exec' контейнером, созданным с нуля? - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь docker exec контейнер, созданный с нуля (скажем, контейнер NATS).Кажется довольно простым, но так как он построен с нуля, я не могу получить доступ к /bin/bash, /bin/sh и буквально к любой такой команде.

Я получаю ошибку: oci runtime error (команда не найдена, файл не найден и т. д. в зависимости от команды, которую я ввожу).

Я пробовал некоторые команды, такие как:

docker exec -it <container name> /bin/bash
docker exec -it <container name> /bin/sh
docker exec -it <container name> ls

У меня вопрос, как мне docker exec контейнер, которыйпостроен с нуля и состоит только из двоичных файлов?Делая docker exec, я хочу выяснить, были ли файлы успешно скопированы с моего хоста в контейнер (у меня есть COPY в Dockerfile).

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019

Есть несколько вариантов.

  1. Вы можете сделать docker container cp ${CONTAINER}:/path/to/file/on/container /path/to/temp/dir/on/host.Это скопирует файлы на ваш хост, где вы сможете проверить вещи с помощью инструментов хоста.
  2. Вы можете добавить соответствующий VOLUME в свой Dockerfile.Тогда вы можете docker container inspect ${CONTAINER}.Это откроет имя тома, где файлы должны быть.Затем вы можете проверить их в другом контейнере (на основе изображения со всеми необходимыми инструментами).
  3. Во время выполнения вы можете привязать контейнер к каталогу тома или хоста в соответствующем месте.
  4. Вы можете добавить те двоичные файлы, которые вам нужны, к изображению.Если вам нужны /bin/ls или /bin/sh, то вы можете добавить их.
  5. Вы можете привязать необходимые двоичные файлы к контейнеру - так, чтобы контейнер имел их для целей проверки, но изображение не раздулось ими.
0 голосов
/ 07 августа 2019

Если ваш рабочий контейнер работает, вы можете скопировать оболочку (и другие необходимые утилиты) в свою файловую систему, а затем выполнить ее.Оболочка должна быть статическим двоичным файлом.Busybox - отличный выбор, потому что он может удвоить количество других двоичных файлов.

Полный пример:

# Assumes scratch container is last launched one, else replace with container ID of
# scratch image, e.g. from `docker ps`, for example:
# scratch_container_id=401b31621b36
scratch_container_id=$(docker ps -ql)

docker run -d busybox:latest sleep 100
busybox_container_id=$(docker ps -ql)
docker cp "$busybox_container_id":/bin/busybox .

# The busybox binary will become whatever you name it (or the first arg you pass to it), for more info run:
# docker run busybox:latest /bin/busybox
# The `busybox --install` command copies the binary with different names into a directory.

docker cp ./busybox "$scratch_container_id":/busybox

docker exec -it "$scratch_container_id" /busybox sh -c '
export PATH="/busybin:$PATH"
/busybox mkdir /busybin
/busybox --install /busybin
sh'

Для Kubernetes я думаю Эфемерные контейнеры предоставляют или предоставятЭквивалентная функциональность.

Ссылки: Ошибка изображения Java-докера без помех https://github.com/GoogleContainerTools/distroless/issues/168#issuecomment-371077961

0 голосов
/ 16 февраля 2019

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

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

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

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