为什么一个在Docker容器内有效的命令,无法通过docker run在外部运行?

4
我有一个叫做my_container的容器,当我运行docker run -i -t my_container时,可以运行npm --version并获得2.7.4的版本。
但是,当我尝试从容器外部使用docker run --workdir=/home/ubuntu/www my_container npm --version运行相同的命令时,我会收到一个错误消息:

无法找到npm。 lxc-start:容器启动失败。 lxcstart:可以通过设置--logfile和--logpriority选项获得其他信息。

我运行的大多数命令都有这样的行为,而不仅仅是npm。 我在Circle CI中执行此操作,如果这有更多的线索,请告诉我。
1个回答

3

可能是因为容器的entrypoint被设计为提供一个shell,但不接受参数。您可以使用docker inspect查看镜像的入口点。

$ docker build -
FROM busybox
ENTRYPOINT ["/bin/sh"]
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon 
Step 0 : FROM busybox
 ---> 8c2e06607696
Step 1 : ENTRYPOINT /bin/sh
 ---> Running in eb5b4d32af96
 ---> ad1286aebbe2
Removing intermediate container eb5b4d32af96
Successfully built ad1286aebbe2

13:59 ~ $ docker run --rm -ti ad1286aebbe2 echo hi
/bin/sh: can't open 'echo'

busybox 官方没有入口点,因此参数被视为命令,这意味着它们直接传递到 /bin/sh -c。


我正在使用的Dockerfile没有入口点,echo可以正常工作,但npm不能。 - jeff_kile
Dockerfile 可能没有 entrypoint,但如果 FROM 语句是已经有 entrypoint 的镜像,则该镜像仍然可能有一个 entrypoint。 - kojiro
当我运行docker inspect时,有两个地方出现了“Entrypoint”,它们都是“null”。 - jeff_kile

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