在我的NodeJS docker容器中找不到npm命令

3

我创建了一个 Docker 镜像:

$ docker build -t stephaneeybert/nodejs .
Sending build context to Docker daemon  2.56 kB
Step 1 : FROM debian
 ---> 1b088884749b
Step 2 : RUN apt-get clean && apt-get update
 ---> Using cache
 ---> b12133d6342f
Step 3 : RUN apt-get install -y curl
 ---> Using cache
 ---> 22dfb4882b12
Step 4 : RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash
 ---> Using cache
 ---> 27f2fac45254
Step 5 : RUN . ~/.nvm/nvm.sh; nvm install stable
 ---> Using cache
 ---> 20d99d545755
Step 6 : RUN . ~/.nvm/nvm.sh; nvm use stable
 ---> Using cache
 ---> 9ec14efb2407
Step 7 : RUN . ~/.nvm/nvm.sh; npm install -g npm
 ---> Using cache
 ---> d264d38565f3
Step 8 : EXPOSE 9001
 ---> Using cache
 ---> 29e3589557e1
Step 9 : ENTRYPOINT /usr/bin/tail -f /dev/null
 ---> Using cache
 ---> 2ce499300fe1
Successfully built 2ce499300fe1

图像脚本如下:
FROM debian

RUN apt-get clean && apt-get update
RUN apt-get install -y curl

# Installing nodesjs

RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash

RUN . ~/.nvm/nvm.sh; nvm install stable
RUN . ~/.nvm/nvm.sh; nvm use stable
RUN . ~/.nvm/nvm.sh; npm install -g npm

EXPOSE 9001

ENTRYPOINT ["/usr/bin/tail", "-f", "/dev/null"]

然后我运行容器并打开一个bash shell:

$ docker run -d -p 127.0.0.1:9001:9001 --name nodejs stephaneeybert/nodejs
c6dddf0a5eb0f11c897f63910eb01f2868fe0f39a80e5e2a580ef3a82935b27b
[stephane@stephane-ThinkPad-X301 nodejs]
$ docker exec -it nodejs bash
root@c6dddf0a5eb0:/# 

一旦进入其中,我尝试获取版本信息:
root@c6dddf0a5eb0:/# npm -v
bash: npm: command not found

但是找不到npm。

在交互式shell中输入命令nvm use stable时,会出现以下错误:N/A:版本“N/A”尚未安装。

我理解存在一个针对不存在的节点版本的别名。

nvm ls命令显示:

root@60446f9286d0:/# nvm ls
            N/A
node -> stable (-> N/A) (default)
iojs -> N/A (default)

调试器显示如下内容:
root@60446f9286d0:/# nvm debug
nvm --version: v0.32.1
$SHELL: /bin/bash
$HOME: /root
$NVM_DIR: '$HOME/.nvm'
$PREFIX: ''
$NPM_CONFIG_PREFIX: ''
nvm current: none
which node: 
which iojs: 
which npm: 
npm config get prefix: bash: npm: command not found
npm root -g: bash: npm: command not found

1- 为什么我需要在每个命令中使用 . ~/.nvm/nvm.sh; 来源此脚本?

2- 为什么我的Node包管理器在bash shell中找不到?

编辑:我稍微修改了Dockerfile文件的内容:

RUN curl -o-https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash \
  && . ~/.nvm/nvm.sh \
  && nvm install stable \
  && nvm alias default stable \
  && nvm use default

现在构建它将显示如下:

Step 4 :RUN curl -o https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash   && . ~/.nvm/nvm.sh   && nvm install stable   && nvm alias default stable   && nvm use default
 ---> Running in 7d2c404135dd
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 10250  100 10250    0     0  18258      0 --:--:-- --:--:-- --:--:-- 18238
=> Downloading nvm as script to '/root/.nvm'

=> Appending source string to /root/.bashrc
=> Close and reopen your terminal to start using nvm or run the following to use it now:

export NVM_DIR="/root/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm
######################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v7.2.0 (npm v3.10.9)
Creating default alias: default -> stable (-> v7.2.0 *)
default -> stable (-> v7.2.0 *)
Now using node v7.2.0 (npm v3.10.9)
 ---> ad960a4addbe
Removing intermediate container 7d2c404135dd
Step 5 : EXPOSE 9001
 ---> Running in df9284421302
 ---> 14d386f009fb
Removing intermediate container df9284421302
Step 6 : ENTRYPOINT /usr/bin/tail -f /dev/null
 ---> Running in fa2d71b6dfdf
 ---> d02c8e88eb7f
Removing intermediate container fa2d71b6dfdf
Successfully built d02c8e88eb7f

我看到它已经安装了node v7.2.0并正在使用它。

但是当我用命令docker exec -it nodejs bash登录容器时,它无法找到任何node:

root@f8f2a32b462a:/# nvm --version   
0.32.1
root@f8f2a32b462a:/# npm --version   
bash: npm: command not found
root@f8f2a32b462a:/# echo $NVM_DIR   
/root/.nvm
root@f8f2a32b462a:/# ls -l /root/.nvm
total 100
-rwxr-xr-x 1 root root   313 Nov 26 13:01 nvm-exec
-rw-r--r-- 1 root root 95660 Nov 26 13:01 nvm.sh
root@f8f2a32b462a:/# ls -l /root/.npm
ls: cannot access /root/.npm: No such file or directory

它在这里:./root/.npm/npm - Stephane
1
你尝试过在运行npm -v之前运行“nvm use stable”命令吗?另一个问题是:为什么不使用官方的node docker镜像呢? - Paolo Laurenti
正如您所看到的,命令 nvm use stable 是脚本的一部分并且成功执行了。但是当在交互式 shell 中输入它时,会出现以下错误:N/A: version "N/A" is not yet installed. - Stephane
可能是在Docker中安装nvm的重复问题。 - Paul
不影响你的问题,但是 nvm use stable 已经被弃用了,你应该使用 nvm use node 或者 nvm use iojs。我也同意 @PaoloLaurenti 的观点,为什么不直接使用官方的 Node Docker 镜像呢? - Paul
我的问题更多是为了理解我觉得困惑的事情,但这不是我遇到的问题。实际上,我的依赖容器可以看到并正常使用该节点。我正在构建自己的镜像,因为我感觉自己有点 Docker 新手,很高兴能够学习。 - Stephane
2个回答

3

我改变了安装 Node 的方式,并且不使用 nvm 工具:

RUN curl -sL https://deb.nodesource.com/setup_7.x | bash
RUN apt-get install -y nodejs

现在,在容器中登录时,可以找到Node可执行文件:

$ docker run -d -p 127.0.0.1:9001:9001 --name nodejs stephaneeybert/nodejs
f3a2f054934ef92a9b05486b6f6dbe53abd4390826c06d1b7a490d671d8e3422
[stephane@stephane-ThinkPad-X301 nodejs]
$ docker exec -it nodejs bash
root@f3a2f054934e:/# npm --version                                                                                                           
3.10.9

也许,在使用nvm工具时,我应该在客户端shell中调用npm命令:. ~/.nvm/nvm.sh npm --version


-1

对于 Amazon Linux(Ubuntu Fedora),您可以在 Dockerfile 中使用 yum 安装它,如下所示:

RUN curl -sL https://rpm.nodesource.com/setup_10.x | bash # for node version 10.x
RUN yum -y install nodejs
RUN node --version # optional to check that it worked
RUN npm --version # optional to check that it worked

使用 docker build -t [名称] [本地文件夹路径]

我花了很长时间在谷歌上搜索,虽然不太了解 Linux,但似乎每个版本都与其他版本不同。就像谷歌 docker npm,使用 apt get 不行,弄清楚 wth linux 版本是 amasonlinux.. 好的,叫 Fedora.. 它有 yum 而不是 apt.. 好的.. 你需要在 yum install 中回答 yes,docker 不允许跳过它.. wth.. 我可以用 | yes 来 hackz0r 它,不,那只会 spam y 永远.. 好吧,我可以用 killall,不,在 Fedora 中不行.. 好吧,我可以用 yum 安装而不问问题吗?!-y

2 小时后我们有了这个 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接