Passing parameters to Docker container
我创建了一个集装箱码头。应给出以下内容:
1 2 3 4 5 | docker run --rm container1 > Hello World! docker run --rm container1 Bob > Hello Bob! |
我的Dockerfile:
1 2 3 | FROM ubuntu:14.04 ENTRYPOINT ["/bin/echo","Hello"] CMD ["World!"] |
我的输出:
1 2 3 4 5 | docker run --rm container1 > Hello World! docker run --rm container1 Bob > Hello Bob |
我有个损失"!"
您的问题可能来自于Ubuntu shell对字符串连接的底层不理解。
1 2 | $ echo"Hello""I""am""a""developer" Hello I am a developer |
这是因为外壳没有串联运算符。因此,实际上,用字符串馈送echo将使连接的所有字符串中都有一个
现在,您真正想在这里实现的是可以很容易地使用
1 2 | printf 'Hello %s!' 'Bob' > Hello Bob! |
在那里可以找到关于printf替换的更多信息。
所以如果你的
1 2 3 | FROM ubuntu:14.04 ENTRYPOINT ["printf","Hello %s!"] CMD ["World"] |
你会得到你期望的结果。
1 2 3 4 5 6 7 8 9 | $ cat Dockerfile FROM ubuntu:14.04 ENTRYPOINT ["printf","Hello %s!"] CMD ["World"] $ docker build -t demo . $ docker run --rm demo Bob Hello Bob! |
CMD :
命令的主要目的是为正在执行的容器提供默认值。这些默认值可以包括可执行文件,也可以省略可执行文件,在这种情况下,还必须指定入口点指令。
ENTRYPOINT :
运行容器以不重写映像中指定的可执行文件。使用entrypoint会发送一条强烈的消息,即此容器仅用于运行此命令。
因此,在您的情况下,当您运行时:
1 | docker run --rm container1 Bob |
命令被字符串bob替换,因此结果。
一个dockerfile中只能有一条cmd指令。如果您列出多个命令,那么只有最后一个命令才会生效。
希望这有帮助。
有关入口点和命令的详细信息
编辑:添加一个基本示例来演示如何从命令行获取参数。
1 2 3 4 | #cat Dockerfile FROM ubuntu:14.04 ENTRYPOINT ["/bin/ping"] |
在上面的docker文件中没有提到要执行的命令(cmd),它表示容器在启动时需要一些参数,可以通过下面的命令行提供:
1 2 3 4 5 6 7 | 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 |
通过使用如下命令将参数添加到dockerfile中,可以实现相同的效果:
1 2 3 4 5 6 | cat Dockerfile FROM ubuntu:14.04 ENTRYPOINT ["/bin/ping"] CMD ["-c","1","google.com"] |
现在运行容器时不提供参数:
1 2 3 4 5 6 | 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:
如果您是专门查找的,那么可以将容器作为
1 | docker run --rm container1 Bob! |
据我所知,你不需要在中间插入任何选项。
这是正常的
当你发射
它使用命令
有了争论
当你添加
它取代
通过
看见
dockerfile中的cmd和entrypoint有什么区别?
有关详细信息
也见
https://hub.docker.com/r/k3ck3c/nethogs网站/
它默认监视wlan0,但如果要监视say eth0,只需在
命令,wlan0(默认)将替换为eth0