我创建了一个容器泊坞窗。哪个应该给出以下内容:
docker run --rm container1
> Hello World!
docker run --rm container1 Bob
> Hello Bob!
我的Dockerfile:
FROM ubuntu:14.04
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["World!"]
我的输出:
docker run --rm container1
> Hello World!
docker run --rm container1 Bob
> Hello Bob
我输了“!”
答案 0 :(得分:6)
你的问题可能来自你的Ubuntu shell对字符串连接的不理解
echo
这是有效的,因为shell没有连接运算符。因此,实际上用字符串提供echo将使所有这些字符串连接成echo
,其中没有真正的黑魔法,据我所知,字符串按它们传递给{{的顺序连接起来1}}。
现在你真正想要实现的目标可以通过printf
轻松完成,它可以替代参数中的格式:
printf 'Hello %s!' 'Bob'
> Hello Bob!
有关printf替换的更多信息,请访问there。
所以如果你的Dockerfile
是:
FROM ubuntu:14.04
ENTRYPOINT ["printf", "Hello %s!"]
CMD ["World"]
您将获得预期的结果。
$ cat Dockerfile
FROM ubuntu:14.04
ENTRYPOINT ["printf", "Hello %s!"]
CMD ["World"]
$ docker build -t demo .
$ docker run --rm demo Bob
Hello Bob!
答案 1 :(得分:5)
CMD:
CMD的主要目的是为执行容器提供默认值。这些默认值可以包含可执行文件,也可以省略可执行文件,在这种情况下,您还必须指定ENTRYPOINT指令。
ENTRYPOINT:
运行容器以不覆盖图像中指定的可执行文件。使用ENTRYPOINT会发出一条强烈的消息,即此容器仅用于运行此命令。
因此,在你运行的情况下:
docker run --rm container1 Bob
用字符串Bob替换CMD,从而替换结果。
Dockerfile中只能有一条CMD指令。如果列出多个CMD,则只有最后一个CMD才会生效。
希望这有帮助。
的更多信息编辑:添加一个基本示例来演示如何从命令行获取参数。
#cat Dockerfile
FROM ubuntu:14.04
ENTRYPOINT ["/bin/ping"]
在上面的docker文件中,没有提到要执行的命令(CMD)。它表示容器在启动时需要一些参数。它可以通过命令行提供,如下所示:
docker run --dns=172.24.100.50 -it stack:2.0 -c 1 google.com
PING google.com (216.58.197.78) 56(84) bytes of data.
64 bytes from maa03s21-in-f14.1e100.net (216.58.197.78): icmp_seq=1 ttl=54 time=68.2 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
通过使用CMD将参数添加到dockerfile中可以实现同样的目的:
cat Dockerfile
FROM ubuntu:14.04
ENTRYPOINT ["/bin/ping"]
CMD ["-c", "1", "google.com"]
现在在启动时运行容器而不提供参数:
docker run --dns=172.24.100.50 stack:4.0
PING google.com (216.58.197.78) 56(84) bytes of data.
64 bytes from maa03s21-in-f78.1e100.net (216.58.197.78): icmp_seq=1 ttl=54 time=50.0 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
编辑2:
如果您具体查看,则可以将容器作为
运行docker run --rm container1 Bob!
据我所知,根据需要,无法在两者之间插入。
答案 2 :(得分:0)
这是正常的
启动时
docker run --rm container1
它使用命令
echo
带参数
World !
添加
时 Bob
取代
World!
通过
Bob
见
What is the difference between CMD and ENTRYPOINT in a Dockerfile?
了解更多详情
另见
https://hub.docker.com/r/k3ck3c/nethogs/
它默认监视wlan0,但如果你想监视说eth0,你只需在
的末尾添加eth0 docker run
命令,wlan0(默认值)将替换为eth0