当不在终端时,使用Docker exec命令会出现“command not found”的错误。

3
我对Docker有点迷茫。我尝试通过PM2进程管理器启动我的NodeJS应用程序。一般的语法是pm2 start app.js以下操作成功: 先登录到正在运行的Docker容器中:
docker exec -it mongodb-plus /bin/bash
然后在容器内运行pm2:
root@367a1f9d1XXX:/# pm2 start app.js 以下操作失败: 但是,当我试图在不使用交互式终端会话的情况下达到相同的效果时:
docker exec mongodb-plus /bin/bash -c "pm2 start app.js" ...它会显示bash: pm2: command not found 问题: 为什么bash无法找到第二种变量的pm2可执行文件?
供参考-我的Dockerfile。(它基于mongo镜像,然后安装adminMongo。)
FROM mongo
#Install basic tools via apt-get
RUN apt-get update &&\
    apt-get install -y nano git curl &&\
#Install NVM and latest LTS NodeJS vesion
    curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash &&\
    export NVM_DIR="$HOME/.nvm" &&\
    [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" &&\
    nvm install --lts &&\
    nvm use --lts &&\
    nvm alias default lts/* &&\
#Install adminMongo
    mkdir -p /home/srvuser/apps/adminMongo && cd /home/srvuser/apps/adminMongo && git clone https://github.com/mrvautin/adminMongo.git && mv adminMongo/* . && ls -la &&\
    npm install &&\
#Install PM2 and autostart
    npm install -g pm2 &&\
    pm2 startup
COPY ./app.json /home/srvuser/apps/adminMongo/config
#Expose mongoDB, adminMongo
EXPOSE 27017 1234

实际上,我是用docker run --rm --name mongodb-plus -v mongodata:/data/db -p 27017:27017 -p 1234:1234 mongodb-rcore --auth启动容器的。
我的目标是在容器启动时自动运行adminMongo中的app.js。

2
你能把你的Dockerfile添加到问题中吗?你不应该需要使用docker exec来启动你的应用程序。 - David Maze
@DavidMaze 我添加了 Dockerfile。我的目标是在容器启动时启动 adminMongo NodeJS。由于我在官方的 mongo 镜像上构建图像,所以无法使用 CMD/ENTRYPOINT,因为 mongo 镜像大量使用它... - netblognet
你最好使用一个单独的容器来运行你的应用程序,而不是与数据库混合在一起,并且不要使用nvm。 - David Maze
@netblognet 我不确定,但我猜测这与bashrc或PATH变量有关。其中一个在容器内部,除非你在容器内部,否则不知道n二进制文件的路径。 - Mostafa Hussein
@MostafaHussein 谢谢你的提示。将 pm2 的路径添加到 Dockerfile 中的 $PATH 中解决了问题。 - netblognet
@netblognet,我已经提交了答案,你也可以检查一下。 - Mostafa Hussein
2个回答

3
我认为更好的解决方案是使用以下方法,而不是使用导出,并且不要将节点版本写在多行中,这样会使修改变得更加困难:

我猜想一个更好的解决方案是下面这样,而不是使用导出,也不要将节点版本写在多个行中,这样会让修改变得更加困难:

ENV NVM_DIR /root/.nvm
ENV NODE_VERSION v0.33.2
ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules #Ensure that this is the actual path
ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH
# Then use the NODE_VERSION do download the nodejs version you want

2
在 Dockerfile 中添加 ENV PATH=$PATH:/root/.nvm/versions/node/v10.15.3/bin/ 可以解决这个问题。

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