Ошибка: не удается запустить контейнер: 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?