У меня есть образ докера, который устанавливает grunt
, но когда я пытаюсь запустить его, я получаю сообщение об ошибке:
Error response from daemon: Cannot start container foo_1: \
exec: "grunt serve": executable file not found in $PATH
Если я запускаю bash в интерактивном режиме, grunt
это доступно.
Что я делаю не так?
Вот мой Dockerfile:
# https://registry.hub.docker.com/u/dockerfile/nodejs/ (builds on ubuntu:14.04)
FROM dockerfile/nodejs
MAINTAINER My Name, me@email.com
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"]
CMD grunt
? Или вы можете попытаться выполнить команду grunt, пройдя полный путь?CMD grunt?
Do вы имеете в виду опускать["
и"]
?CMD ["grunt"]
наCMD grunt
CMD ["grunt"]
используете другую оболочку для выполнения команды, то в этой оболочке $ PATH, скорее всего, не будет установлен.Ответы:
Когда вы используете для команды формат exec (например
CMD ["grunt"]
, массив JSON с двойными кавычками), она будет выполняться без оболочки. Это означает, что большинство переменных среды не будут присутствовать.Если вы укажете свою команду как обычную строку (например
CMD grunt
), тогда строка послеCMD
будет выполнена с/bin/sh -c
.Больше информации об этом доступно в разделе CMD ссылки Dockerfile .
источник
sudo set
или(exec set)
. Те потерпят неудачу, потому что они выполняют команды без оболочки (иset
является встроенной оболочкой). Тем не менее,sudo ls
и(exec ls)
будет работать, потому чтоls
это фактический двоичный файл/bin/ls
.Это был первый результат в Google, когда я вставил свое сообщение об ошибке, и это потому, что мои аргументы были не в порядке.
Имя контейнера должно быть после всех аргументов.
Плохой:
Хорошо:
источник
Я нашел ту же проблему. Я сделал следующее:
Когда я изменяю это на
это работает отлично.
источник
-v
здесь.-v
для привязки смонтируйте том (как описано вdocker run --help | grep "\-v"
), для меня я уже/tmp
смонтировал вFile Sharing
(настройках Docker), так почему я должен использовать его снова?Есть несколько возможных причин такой ошибки.
В моем случае это произошло из-за того, что исполняемому файлу (
docker-entrypoint.sh
из Dockerfile блога Ghost ) не хватало режима исполняемого файла после того, как я его скачал.Решение:
chmod +x docker-entrypoint.sh
источник
Контейнер Docker может быть построен без оболочки (например, https://github.com/fluent/fluent-bit-docker-image/issues/19 ).
В этом случае вы можете скопировать статически скомпилированную оболочку и выполнить ее, например:
источник
По какой-то причине я получаю эту ошибку, если я не добавляю осветлитель "bash". Даже добавление «#! / Bin / bash» в начало моего файла точки входа не помогло.
источник
COPY
а затемRUN chmod +x /compile_nibbler.sh
до вызова точки входа.У меня была такая же проблема. После долгих поисков я не мог найти, как это исправить.
Внезапно я заметил свою глупую ошибку :)
Как уже упоминалось в документации , последняя часть
docker run
- это команда, которую вы хотите выполнить, и ее аргументы после загрузки контейнера.НЕ НАЗВАНИЕ КОНТЕЙНЕРА !!!
Это была моя неловкая ошибка.
Ниже я предоставил вам изображение моей командной строки, чтобы увидеть, что я сделал неправильно.
И это исправление, как упомянуто в документации .
источник
чтобы это работало, добавьте мягкую ссылку на / usr / bin:
ln -s $ (какой узел) / usr / bin / node
ln -s $ (который npm) / usr / bin / npm
источник