entrypoint是在构建镜像时指定容器启动时执行的命令或者程序。在使用entrypoint时,有些情况下会用到中括号([])来指定执行的命令和参数,有些则不需要。那么,entrypoint用[]和不用有什么区别呢?下面将逐一阐述。
一、entrypoint不使用[]
在使用entrypoint时,如果不使用中括号[]指定要执行的命令和参数,比如下面的例子:
FROM openjdk:8-jre
WORKDIR /app
ADD ./target/demo.jar /app
ENTRYPOINT java -jar demo.jar
则在运行容器时,可以直接运行如下命令:
docker run imagename
该命令会启动一个容器,并执行java -jar demo.jar命令,启动demo.jar程序。
需要注意的是,如果docker run命令中传入了其他参数,则会被作为启动命令的参数传递给entrypoint。比如:
docker run imagename --arg1 --arg2
则会将--arg1和--arg2作为启动命令的参数传递给java -jar demo.jar。
二、entrypoint使用[]
如果使用entrypoint时,使用了中括号[]指定要执行的命令和参数,比如下面的例子:
FROM openjdk:8-jre
WORKDIR /app
ADD ./target/demo.jar /app
ENTRYPOINT ["java", "-jar", "demo.jar"]
则在运行容器时,需要在命令后面指定要传入entrypoint的参数。比如:
docker run imagename arg1 arg2
该命令会启动一个容器,并执行java -jar demo.jar命令,同时将arg1和arg2作为参数传递给启动命令。
需要注意的是,使用中括号[]指定参数时,必须将整个启动命令和参数列表用双引号引起来,否则会报错。比如:
ENTRYPOINT java -jar demo.jar // 错误示例
ENTRYPOINT ["java", "-jar", "demo.jar"] // 正确示例
三、entrypoint用[]和不用的区别
entrypoint用[]和不用的区别在于传入参数的方式不同。不使用中括号[]指定命令和参数时,命令和参数直接作为entrypoint的参数传递;而使用中括号[]指定命令和参数时,命令和参数作为容器启动命令的参数传递。
使用中括号[]指定命令和参数时,可以避免一些参数传递的问题。比如,在不使用中括号[]指定命令和参数时,如果有参数中包含空格,则需要将参数用双引号引起来,否则会被当做参数的一部分而出错。而使用中括号[]指定命令和参数时,则可以直接将参数列表作为数组传入,不必担心参数中包含空格的问题。
综上所述,entrypoint用[]和不用的区别在于传入参数的方式不同,根据实际情况选用即可。