«Исполняемый файл Docker не найден в $PATH: неизвестно» при попытке запустить «cd»

#docker #dockerfile

Вопрос:

Я написал следующее Dockerfile , которое должно запускать произвольную команду (предоставляя ее с помощью аргументов docker run ):

 FROM ubuntu:20.04

RUN apt -y update amp;amp; apt-get -y update 
RUN apt install -y python3 git

CMD bash
 

Но когда я пытаюсь передать команду, например cd workspace , я получаю следующее:

 C:Usersuser>docker run -it cloudbuildtoolset:latest cd workspace
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "cd": executable file not found in $PATH: unknown.
 

Что я делаю не так?

Пожалуйста, не предлагайте мне перезагрузить мою машину/докер/что угодно

Комментарии:

1. Строго говоря, cd-это не команда. Это встроенное устройство, и его нельзя вызвать напрямую. Рассмотрите возможность использования директивы WORKDIR Dockerfile.

Ответ №1:

cd это специальная встроенная утилита, написанная на языке спецификации оболочки POSIX. Это то, что изменяет поведение запущенной оболочки, а не отдельной программы. Сообщение об ошибке означает то, что оно говорит: нет /bin/cd или аналогичного исполняемого файла, который вы можете запустить.

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

Если вы хотите запустить процесс внутри контейнера, но в другом рабочем каталоге, вы можете использовать этот docker run -w параметр

 docker run -it 
  -w /workspace 
  cloudbuildtoolset:latest 
  the command you want to run
 

или, что эквивалентно, добавьте WORKDIR директиву в свой файл Dockerfile.

Вы также можете запустить оболочку оболочки в качестве основного процесса контейнера. Это позволило бы использовать встроенные команды , такие как cd , но это более сложно в использовании и может привести к проблемам с цитированием.

 docker run -it cloudbuildtoolset:latest 
  /bin/sh -c 'cd /workspace amp;amp; the command you want to run'