将参数传递给Docker容器

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将使连接的所有字符串中都有一个echo,其中没有真正的黑色魔法,据我所知,字符串按照传递给echo的顺序进行连接。

现在,您真正想在这里实现的是可以很容易地使用printf,它可以从参数中替换格式:

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

在那里可以找到关于printf替换的更多信息。

所以如果你的Dockerfile是:

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!

据我所知,你不需要在中间插入任何选项。


这是正常的

当你发射

docker run --rm container1

它使用命令

echo

有了争论

World !

当你添加

Bob

它取代

World!

通过

Bob

看见

dockerfile中的cmd和entrypoint有什么区别?

有关详细信息

也见

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

它默认监视wlan0,但如果要监视say eth0,只需在

docker run

命令,wlan0(默认)将替换为eth0