В Docker после установки глобального модуля модуль не найден

#docker

#docker

Вопрос:

Я создал простой Dockerfile для установки некоторых инструментов узла по всему миру.

 FROM node:10.9.0
RUN npm -g config set user root
RUN npm -g install --unsafe-perm merge-yaml
RUN mkdir -p /workDirectory
WORKDIR /workDirectory
  

Создавая образ, я ожидаю, что merge-yaml будет доступен по любому пути (глобально)

 docker build -t  thisisme/devtools .
  

Но при использовании в качестве exec команда не найдена

 docker run --rm -it -v ${PWD}:/workDirectory thisisme/devtools merge-yaml

docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: "merge-yaml": executable file not found in $PATH".
  

Если я войду в контейнер и проверю, что модуль не добавлен глобально:

 docker run --rm -it  thisisme/devtools /bin/bash
root@e77027bb2f57:/workDirectory# merge-yaml
bash: merge-yaml: command not found
  

Я уверен, что я поступаю неправильно, потому что в интерактивном режиме устанавливается глобально и не работает (как я и ожидал)

 root@e77027bb2f57:/workDirectory# npm install -g merge-yaml
  merge-yaml@1.1.0
updated 1 package in 0.584s
root@e77027bb2f57:/workDirectory# merge-yaml
bash: merge-yaml: command not found
root@e77027bb2f57:/workDirectory# 
  

Заранее спасибо

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

1. Либо я действительно не понимаю, либо я что-то упускаю… Вы устанавливаете пакет npm , а затем пытаетесь проверить, присутствует ли он, используя его имя в качестве команды оболочки . Если вы на самом деле не создадите эту команду самостоятельно (например, создав исполняемый скрипт nodejs, который будет использовать вышеуказанный пакет и который вы предоставляете в PATH), не похоже, что сам модуль устанавливает эту команду где угодно. Между тем, using -g устанавливает пакет /usr/local/lib/node_modules таким образом, чтобы он был доступен во всем мире.

2. Спасибо @Zeitounator за ответ. Но на моем компьютере я установлен глобально, и я могу выполнить команду без создания каких-либо node.js скрипт …. вот что меня смутило, почему мой компьютер добавляется непосредственно в path, а контейнер docker — нет. Но я думаю, я ошибаюсь и, возможно, я установил merge-yaml-cli на свой ноутбук..

Ответ №1:

Если вы хотите использовать командную строку, вам следует установить merge-yaml-cli вместо этого.

Dockerfile :

 FROM node:10.9.0
RUN npm -g config set user root
RUN npm -g install --unsafe-perm merge-yaml-cli
RUN mkdir -p /workDirectory
WORKDIR /workDirectory
  

После создания образа будет доступен merge-yaml :

 user@term:~/work $ docker run --rm -it quentin/test merge-yaml
Usage: /usr/local/bin/merge-yaml <options>

Options:
  -i, --inputs  Input files specified as glob file patterns   [array] [required]
  -o, --output  Output file                                  [string] [required]

Examples:
  /usr/local/bin/merge-yaml -i one.yml two/*.yml -o out.yml

Missing required arguments: i, o
  

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

1. Спасибо, ребята, я ошибся в зависимости, которую я установил. Теперь работает.