#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'