如何无需自定义镜像重写Azure Pipelines服务容器ENTRYPOINT参数?
我需要在Azure Pipelines运行期间保持一个service container处于启动状态,当前配置如下:
resources: containers: - container: my_service image: dockerhub-service-image:1.0.0 services: my_service: my_service
我需要略微覆盖其默认启动配置,为此需为ENTRYPOINT命令添加自定义参数。但发现Azure Pipelines的yaml配置中,resources.containers部分无法覆盖CMD,仅能通过options参数利用docker start的--entrypoint来覆盖ENTRYPOINT。由于Dockerfile的ENTRYPOINT支持可包含命令和多参数的exec form(示例如下):
FROM alpine/curl ENTRYPOINT ["curl" , "http://example.com/" ]
若--entrypoint可覆盖ENTRYPOINT的exec form则可解决问题,但我不清楚如何通过命令行的--entrypoint指定exec form,且有资料显示无法用多参数覆盖入口点。现咨询:
--entrypoint是否确实无法支持exec form?- 若无法实现,是否有其他无需自定义镜像的方法来重写Azure Pipelines服务容器的ENTRYPOINT参数?
问题解答
1. --entrypoint是否支持exec form?
Docker命令行的--entrypoint参数只能指定单个可执行文件的路径,没法直接传入exec form那种包含命令加多个参数的数组。它的作用只是替换镜像ENTRYPOINT定义里的可执行命令部分,后续的参数得通过docker run命令末尾的内容来传递,不能直接塞到--entrypoint里。
举个例子,你给出的alpine/curl镜像原ENTRYPOINT是["curl", "http://example.com/"],如果用docker run --entrypoint curl myimage http://custom-url.com,实际启动后执行的命令就是curl http://custom-url.com——相当于替换了原ENTRYPOINT里的参数,但可执行命令还是curl。
2. Azure Pipelines中无需自定义镜像的替代方案
在Azure Pipelines的service container配置里,有两种不用重新构建镜像就能调整启动参数的方法:
方案一:用options指定--entrypoint+arguments传参
在resources.containers的options字段里指定原ENTRYPOINT的可执行命令,然后在service配置中用arguments传递自定义参数。示例配置如下:
resources: containers: - container: my_service image: dockerhub-service-image:1.0.0 options: "--entrypoint curl" # 指定原ENTRYPOINT的可执行命令 services: my_service: image: my_service arguments: "http://custom-target.com" # 传递自定义参数
这样配置后,容器实际执行的就是curl http://custom-target.com,覆盖了原ENTRYPOINT里的默认参数。
方案二:用command字段直接指定完整启动命令(部分场景适用)
如果镜像的ENTRYPOINT是["sh", "-c"]这类shell形式,或者镜像里包含sh工具,也可以直接用command字段指定完整的启动命令,这样会同时覆盖原镜像的ENTRYPOINT和CMD:
resources: containers: - container: my_service image: dockerhub-service-image:1.0.0 services: my_service: image: my_service command: ["sh", "-c", "curl http://custom-target.com"]
内容的提问来源于stack exchange,提问作者Kirill

