如何在Jenkins中运行带有ENTRYPOINT的Docker镜像?
在Jenkins Pipeline中直接运行Docker镜像(对应
docker run) 我完全懂你的需求——你要的是直接触发镜像自带的ENTRYPOINT来启动容器,就像在命令行敲docker run foo那样,而不是用docker.image('foo').inside()那种在容器内部执行自定义脚本的方式。
其实Jenkins的Docker Pipeline插件已经提供了对应的方法,具体操作如下:
基础用法:直接运行镜像
在Jenkinsfile里,对应命令行docker run foo的操作,你可以使用docker.image('foo').run()方法。这个调用会直接启动容器,让镜像的ENTRYPOINT(如果没有ENTRYPOINT则用CMD)执行,和命令行的效果完全一致。
示例代码片段:
script { // 先构建镜像,等价于docker build -t my-app . docker.build("my-app") // 直接运行镜像,等价于docker run my-app docker.image('my-app').run() }
带参数运行(端口映射、环境变量等)
如果需要像docker run -p 8080:80 -e ENV=prod foo那样添加额外参数,只需要把参数字符串传给run()方法即可:
docker.image('my-app').run('-p 8080:80 -e APP_ENV=production')
后台运行容器(对应docker run -d)
如果希望容器在后台启动,不阻塞后续的Pipeline步骤,只需要在参数里加上-d:
docker.image('my-app').run('-d')
和inside()的区别再强调一下
docker.image('foo').inside():让Jenkins的后续Pipeline步骤在容器内部执行,相当于临时进入容器做一些操作(比如编译、测试),操作完成后容器会被清理。docker.image('foo').run():直接启动容器,让镜像的ENTRYPOINT/CMD完整运行,和你手动在命令行执行docker run的行为完全一致,容器会按照镜像定义的逻辑运行(直到ENTRYPOINT进程结束,或者你手动停止)。
内容的提问来源于stack exchange,提问作者ewok
相关产品推荐
相关产品推荐

