Ошибка: не удается запустить контейнер: stat/bin/sh: нет такого файла или каталога "
Я пытаюсь создать свой собственный базовый образ busybox.
# ./mkimage.sh -t pensu/busybox busybox-static
+ mkdir -p /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs
+ tar --numeric-owner -caf /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs.tar.xz -C /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs '--transform=s,^./,,' .
+ cat > '/var/tmp/docker-mkimage.US3tHy0uBQ/Dockerfile'
+ rm -rf /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs
+ docker build -t pensu/busybox /var/tmp/docker-mkimage.US3tHy0uBQ
Sending build context to Docker daemon 863.2 kB
Sending build context to Docker daemon
Step 0 : FROM scratch
--->
Step 1 : ADD rootfs.tar.xz /
---> 8eac78bfc9d6
Removing intermediate container ad9bbb8f7536
Successfully built 8eac78bfc9d6
+ rm -rf /var/tmp/docker-mkimage.US3tHy0uBQ
Я вижу, что изображение доступно с моей репликой докеров.
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
pensu/busybox latest 8eac78bfc9d6 7 seconds ago 2.476 MB
Но когда я пытаюсь выполнить docker run, я всегда получаю ошибку:
# docker run -it pensu/busybox /bin/sh
exec: "/bin/sh": stat /bin/sh: no such file or directorytime="2015-04-09T16:03:45+05:30" level="fatal" msg="Error response from daemon: Cannot start container 8fe73b7832193c847d7975175a4be86d1f0b550b6a00b812bd4cdd18fe752468: exec: \"/bin/sh\": stat /bin/sh: no such file or directory"
Я не могу понять, почему он дает эту ошибку? Я делаю что-то неправильно? Как еще я могу проверить, что я создаю правильное изображение, находящееся в рабочем состоянии?
Ответы
Ответ 1
После создания изображения проверьте его с помощью:
$ docker inspect $image_name
и проверьте, что у вас есть в опции CMD. Для занятой коробки это должно быть:
"Cmd": [
"/bin/sh"
]
Возможно, вы перезаписываете опцию CMD в вашем. /mkimage.sh
Ответ 2
Я ударил эту ошибку ( "stat/bin/ bash: no такой файл или каталог" ) при запуске команды:
docker exec -it 80372bc2c41e /bin/bash
Решение заключалось в определении типа терминала (или оболочки), доступного в контейнере. Для этого я побежал:
docker inspect 80372bc2c41e
В выводе этой команды я увидел:
"Cmd": [
"/bin/sh",
"-c",
"gunicorn -b 0.0.0.0:7082 server.app:app"
],
Это говорит мне, что существует команда /bin/sh
, и я смог установить соединение с:
docker exec -it 80372bc2c41e /bin/sh
Ответ 3
Эта ошибка
Докер: Ошибка ответа от демона: Ошибка создания среды выполнения OCI: container_linux.go: 348: запуск процесса контейнера вызвал "exec: \ "/bin/sh \": stat/bin/sh: нет такого файла или каталога ": неизвестно.
происходит при создании образа докера из базового образа, например. scratch
. Это связано с тем, что полученное изображение не имеет оболочки для выполнения изображения. Если вы используете:
ENV EXECUTABLE hello
cmd [$EXECUTABLE]
в вашем файле Docker Docker использует /bin/sh для анализа входной строки. и, следовательно, ошибка. Проверяя изображение, вы найдете:
$docker inspect <image-name>
"Entrypoint": [
"/bin/sh",
"-c",
"[$HM_APP]"
]
Это означает, что аргументы ENTRYPOINT или CMD будут проанализированы с использованием /bin/sh -c. Решение, которое мне помогло, состоит в том, чтобы проанализировать команду как массив строк JSON, например.
cmd ["hello"]
и снова осматриваем изображение:
"Entrypoint": [
"hello"
]
Это устраняет зависимость от /bin/sh, которую приложение docker теперь может выполнять двоичный файл. Пример:
FROM scratch
# Environmental variables
# Copy files
ADD . /
# Home dir
WORKDIR /bin
EXPOSE 8083
ENTRYPOINT ["hospitalms"]
Надеюсь, это поможет кому-то в будущем.
Ответ 4
Явно упоминаю версию ubuntu в файле докеров, который вы пытаетесь запустить,
FROM ubuntu:14.04
Не используйте, например, FROM ubuntu:Latest
. Это разрешило мое выше "Не удается запустить контейнер: стат /bin/sh: нет такого файла или каталога" проблема
Ответ 5
У вас нет оболочки в /bin/sh? Вы пробовали docker run -it pensu/busybox /usr/bin/sh
?