将参数传递给Docker容器

时间:2017-05-26 09:05:54

标签: docker

我创建了一个容器泊坞窗。哪个应该给出以下内容:

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

我输了“!”

3 个答案:

答案 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才会生效。

希望这有帮助。

有关ENTRYPOINTCMD

的更多信息

编辑:添加一个基本示例来演示如何从命令行获取参数。

#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