如何向 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
.bashrc
说export 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 容器发送命令?的主要内容,如果未能解决你的问题,请参考以下文章