Docker: исполняемый файл не найден в $PATH

У меня есть изображение докера, которое устанавливает grunt, но когда я пытаюсь запустить его, я получаю сообщение об ошибке:

Error response from daemon: Cannot start container foo_1: \
    exec: "grunt serve": executable file not found in $PATH

Если я запускаю bash в интерактивном режиме, grunt доступен.

Что я делаю неправильно?

Вот мой файл Docker:

# https://registry.hub.docker.com/u/dockerfile/nodejs/ (builds on ubuntu:14.04)
FROM dockerfile/nodejs

MAINTAINER My Name, [email protected]

ENV HOME /home/web
WORKDIR /home/web/site

RUN useradd web -d /home/web -s /bin/bash -m

RUN npm install -g grunt-cli
RUN npm install -g bower

RUN chown -R web:web /home/web
USER web

RUN git clone https://github.com/repo/site /home/web/site

RUN npm install
RUN bower install --config.interactive=false --allow-root

ENV NODE_ENV development

# Port 9000 for server
# Port 35729 for livereload
EXPOSE 9000 35729
CMD ["grunt"]

Ответ 1

Когда вы используете формат exec для команды (например, CMD ["grunt"], массив JSON с двойными кавычками), он будет выполнен без оболочки. Это означает, что большинство переменных окружения не будут присутствовать.

Если вы укажете свою команду как обычную строку (например, CMD grunt), строка после CMD будет выполнена с помощью /bin/sh -c.

Дополнительная информация об этом доступна в разделе CMD Ссылка на Dockerfile.

Ответ 2

Это был первый результат в google при вставке моего сообщения об ошибке, и это потому, что мои аргументы были не в порядке.

Имя контейнера должно быть после всех аргументов.

Плохо:

docker run <container_name> -v $(pwd):/src -it

Хорошо:

docker run -v $(pwd):/src -it <container_name>

Ответ 3

Я нашел ту же проблему. Я сделал следующее:

docker run -ti devops -v /tmp:/tmp /bin/bash

Когда я меняю его на

docker run -ti -v /tmp:/tmp devops /bin/bash

он отлично работает.

Ответ 4

Есть несколько возможных причин такой ошибки.

В моем случае это произошло из-за того, что исполняемому файлу (docker-entrypoint.sh из Dockerfile блога Ghost) не хватает режима исполняемого файла после того, как я его скачал.

Решение: chmod +x docker-entrypoint.sh

Ответ 5

Контейнер Docker может быть создан без оболочки (например, https://github.com/fluent/fluent-bit-docker-image/issues/19).

В этом случае вы можете скопировать статически скомпилированную оболочку и выполнить ее, например:

docker create --name temp-busybox busybox:1.31.0
docker cp temp-busybox:/bin/busybox busybox
docker cp busybox mycontainerid:/busybox
docker exec -it mycontainerid /bin/busybox sh

Ответ 6

Существует несколько возможных причин такой ошибки. В моем случае контейнер или изображение должны быть разбиты, когда мой ноутбук внезапно отключился. Решение:

1 Удалите контейнер и изображение

2 Восстановите изображение и запустите контейнер

надеюсь, что это поможет

Ответ 7

По какой-то причине я получаю эту ошибку, если я не добавляю осветлитель "bash". Даже добавление "#!/Bin/bash" в начало моего файла точки входа не помогло.

ENTRYPOINT [ "bash", "entrypoint.sh" ]

Ответ 8

чтобы заставить его работать, добавьте мягкую ссылку на /usr/bin:

ln -s $(который node)/usr/bin/node

ln -s $(который npm)/usr/bin/npm