Docker Путь WORKDIR добавлен к относительному пути - PullRequest
2 голосов
/ 28 мая 2020

У меня проблема, что следующий ДОКЕРФАЙЛ оказывается в исключении, где он не может найти /src/webui/tail -f /dev/null, и это правильно, потому что я хотел выполнить только tail -f /dev/null.

docker build is работает , docker run is не работает !

Как я могу избежать добавления пути WORKDIR к команде tail?

DOCKERFILE:

FROM node:12.17.0-alpine
WORKDIR /src/webui
RUN apk update && apk add bash
CMD ["tail -f /dev/null"]

Исключение :

> docker run test
internal/modules/cjs/loader.js:969
  throw err;
  ^

Error: Cannot find module '/src/webui/tail -f /dev/null'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:966:15)
    at Function.Module._load (internal/modules/cjs/loader.js:842:27)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: []
}

Информация о системе:

  • Docker Рабочий стол (Windows 10 Pro)
  • Docker версия 19.03.8, сборка afacb8b

Ответы [ 3 ]

1 голос
/ 28 мая 2020

Когда вы даете CMD (или RUN или ENTRYPOINT) в форме JSON -массив, вы должны вручную разбить команду на «слова». То есть вы запускаете эквивалент указанной в кавычках команды оболочки

'tail -f /dev/null'

, и все это интерпретируется как одно «слово» - пробелы и параметры принимаются как часть имени команды для просмотра в $PATH.

Самый простой способ решения этой проблемы - удалить кавычки и просто использовать пустую строку как CMD.

Обратите внимание, что контейнер, который вы создаете, не на самом деле ничего не делает: он не включает в себя исходный код приложения, а команда, которую вы предоставляете намеренно, ничего не делает навсегда. Помимо одного запущенного контейнера с незанятым процессом, вы получите тот же эффект, просто не запустив контейнер. Обычно вы хотите скопировать код своего приложения и установить CMD для его фактического запуска:

FROM node:12.17.0-alpine
WORKDIR /src/webui
COPY package.json yarn.lock ./
RUN yarn install
COPY . ./
CMD ["yarn", "start"]
# Also works:  CMD yarn start
# Won't work:  CMD ["yarn start"]
1 голос
/ 28 мая 2020

Правильный Dockerfile:

FROM node:12.17.0-alpine
WORKDIR /src/webui
RUN apk update && apk add bash
CMD ["tail", "-f", "/dev/null"]

Итак, разница в том, что это:

CMD ["tail -f /dev/null"]

должно быть:

CMD ["tail", "-f", "/dev/null"]

Вы можете узнать больше о CMD в официальной Docker docs .

0 голосов
/ 28 мая 2020

CMD будет добавлено после ENTRYPOINT

Поскольку node: 12.17.0-alpine имеет значение по умолчанию ENTRYPONINT node

Ваш файл dockerfile станет

node tail -f /dev/null

option1

Переопределить ENTRYPOINT во время сборки

ENTRYPOINT tail -f /dev/null

option2

Переопределить ENTRYPOINT во время выполнения

docker run --entrypoint sh my-image
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...