如何向 Docker 容器发送命令?

Posted

技术标签:

【中文标题】如何向 Docker 容器发送命令?【英文标题】:How to send command to Docker container? 【发布时间】:2019-02-02 10:11:53 【问题描述】:

在我的部署过程中,我需要在服务器上的文件可用后运行npm run production

由于我部署到 Docker 容器,我想我需要运行类似的东西:

cd /apps/laradock/ && docker-compose exec -T workspace bash -c "cd /var/www/myapp/ && npm run production"

不幸的是,这会产生错误:

bash: npm: command not found

但 npm 在容器外和容器内都可用!

在容器外,which npm 产生/home/serviceUser/.nvm/versions/node/v10.9.0/bin/npm 如果我通过cd /apps/laradock/ && docker-compose exec workspace bash 进入容器然后运行which npm,它也会安装在那里(并显示/home/laradock/.nvm/versions/node/v10.9.0/bin/npm)。

我做错了什么?

【问题讨论】:

我想npm run production 在您已经运行的服务器中添加了依赖项。我认为可以在复制源文件后使用脚本或入口点执行命令来完成此任务。 @EddyHernandez 我不太明白你的建议。 您的.bashrc 或容器内的类似登录脚本是否设置了npm 的路径? 【参考方案1】:

这里有 2 个选项。

1) 使用 npm 二进制文件的完整路径;而不是使用npm run production 使用/home/laradock/.nvm/versions/node/v10.9.0/bin/npm run production

2) 将 nvm 添加到您的 .bashrc(如果您使用 bash)以获取它,以便您可以直接键入 nvm:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

不确定你是如何安装 nvm 的,因为如果你按照他们 github 页面上的安装说明进行操作,那应该已经添加到你的 .bashrc 文件中

有关如何安装 nvm、获取并使用它的更多信息,您可以查看以下链接: https://github.com/creationix/nvm#install-script

【讨论】:

您的第一个选项导致/usr/bin/env: ‘node’: No such file or directory。第二个选项已经是我所拥有的。我的~/.bashrc 已经有这些行(除了容器内的NVM_DIR .bashrcexport NVM_DIR="/home/laradock/.nvm")。 我的意思是:感谢您快速而清晰的回答!我感谢您尝试提供帮助。我会继续四处寻找,看看我能弄清楚什么。【参考方案2】:

我想知道升级 npm 和 nodejs 是否是它工作的原因。这是我所做的(以 root 身份而不是使用 --user=laradock 进入工作区容器):

cd /apps/laradock/ && docker-compose exec workspace bash
apt-get update
apt-get install -y npm
curl -sL https://deb.nodesource.com/setup_10.x | bash -
apt-get install -y nodejs

(来自https://***.com/a/34558299/470749 和https://askubuntu.com/a/1044694/48214)

现在可以了:docker exec -it laradock_workspace_1 /bin/sh -c "cd /var/www/myapp/ && npm run production"

如果我也能解决这个类似的问题,那就太好了:How to use Deployer with Docker (Laradock)

附:现在在容器外,npm -v 显示“6.2.0”,nodejs -v 显示“v4.2.6”,而在容器内:npm -v 显示“6.4.0”,nodejs -v 显示“v10.9.0”和@987654331 @ 显示“0.33.8”。

我仍然不确定如何在 Laradock Dockerfile 中正确安装它。它安装 nvm 和 npm 的默认方式似乎不会将它们暴露给来自容器外部的命令,例如 docker exec -it laradock_workspace_1 /bin/bash -c "npm -v"

12 个月后更新

我在我的 Dockerfile 底部附近添加了这个(越早添加它会导致错误),它似乎工作:

RUN apt update && \
    apt install -y npm nodejs

#https://***.com/a/26320915/470749
RUN ln -s /usr/bin/nodejs /usr/bin/node 

RUN npm --version && node --version

RUN npm cache clean -f && \
    npm install npm@latest -g n && \
    #npm install -g n && \
    n stable && \    
    npm --version && node --version

【讨论】:

以上是关于如何向 Docker 容器发送命令?的主要内容,如果未能解决你的问题,请参考以下文章

在 docker 容器中捕获信号

容器常用操作 - 每天5分钟玩转 Docker 容器技术(25)

docker学习-常用命令1

Docker 命令- kill命令

docker命令行解析以及如何向服务器端发送请求

34-Docker-常用命令详解-docker kill