将parameter passing给Docker容器

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

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 

我有一个损失“!”

你的问题可能来自你的Ubuntu shell完成的string连接的底层不理解

 $ echo "Hello" "I" "am" "a" "developer" Hello I am a developer 

这是可行的,因为shell没有连接运算符。 所以,实际上用string喂回声会使所有这些string连接在一起,这里没有真正的黑魔法,而据我所知,这些string按照它们传递的顺序连接在一起。

现在你真正想要实现的东西可以很容易地用printf来完成,它可以用参数代替格式:

 printf 'Hello %s!' 'Bob' > Hello Bob! 

有关printf替代的更多信息可以在那里find。

所以如果你的Dockerfile是:

 FROM ubuntu:14.04 ENTRYPOINT ["printf", "Hello %!"] 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! 

CMD:

CMD的主要目的是为正在执行的容器提供默认值 。 这些默认值可以包含可执行文件,也可以省略可执行文件,在这种情况下,您还必须指定一个ENTRYPOINT指令。

入口点 :

运行容器以不覆盖图像中指定的可执行文件 。 ENTRYPOINT的使用发送了一个强大的消息,这个容器只用来运行这一个命令。

因此在你的情况下,当你运行:

 docker run --rm container1 Bob 

CMD被replace为stringBob,从而得到结果。

Dockerfile中只能有一个CMD指令 。 如果列出多个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! 

据我所知,没有select插入之间,因为你需要。

这个是正常的

当你启动

docker run --rm container1

它使用该命令

echo

与论据

World !

当你添加

Bob

它取代

World!

通过

Bob

看到

在Dockerfile中,CMD和ENTRYPOINT有什么区别?

更多细节

也可以看看

https://hub.docker.com/r/k3ck3c/nethogs/

它默认情况下监视wlan0,但是如果你想监视eth0,你只需在eth0结尾添加

docker run

命令,wlan0(默认)将被eth0replace