将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