构建之后如何运行容器?gradle-docker 的 DockerRun 任务实战(端口映射/环境变量/数据卷)
构建之后如何运行容器?gradle-docker 的 DockerRun 任务实战(端口映射/环境变量/数据卷)
【免费下载链接】gradle-dockerA Gradle plugin to build Docker images from the build script.项目地址: https://gitcode.com/gh_mirrors/gra/gradle-docker
镜像构建完成只是第一步,如何用 gradle-docker 插件一键启动容器、完成端口映射、注入环境变量并挂载数据卷,才是开发流程真正顺畅的关键。gradle-docker 是一个基于 Gradle 构建脚本创建并发布 Docker 镜像的开源插件,除了经典的distDocker构建任务,它还内置了专门的DockerRun任务类型,让你在 Gradle 里就能完成docker run的全部操作,无需手动敲命令行。
为什么需要 DockerRun 任务?
很多团队在用 Gradle 构建完 Docker 镜像后,还得手动执行docker run -p ... -e ... -v ...一长串命令。参数一多就容易出错,而且无法纳入版本管理。gradle-docker 提供的DockerRun任务把容器的启动参数全部固化在构建脚本里,一条./gradlew dockerRun就能复现整个运行环境,配合 CI/CD 流水线尤其方便。
这个任务类型由插件在应用时自动注册,你可以在 DockerPlugin.groovy 中看到project.ext.DockerRun = DockerRunTask.class这行代码,意味着只要在 build.gradle 里声明任务类型为DockerRun即可直接使用。
DockerRun 任务的基础配置方法
先看一个最简配置,声明任务并指定要运行的镜像标签:
apply plugin: 'docker' buildscript { repositories { jcenter() } dependencies { classpath 'se.transmode.gradle:gradle-docker:1.2' } } task runApp(type: DockerRun) { containerName = 'my-app' }DockerRun任务的属性定义在 DockerRunTask.groovy 中,核心字段包括:
containerName:容器名称,对应docker run --namedetached:是否后台运行(对应-d)autoRemove:退出后是否自动删除容器(对应--rm)env:环境变量集合ports:端口映射集合volumes:数据卷挂载集合volumesFrom:继承其他容器的数据卷links:容器互联
镜像标签默认按group/applicationName:版本号规则生成,未指定版本时使用latest,与 DockerTaskBase.groovy 中的标签逻辑保持一致。
端口映射实战:publish 方法
Web 应用运行后必须把容器内端口暴露到宿主机才能访问。DockerRun任务通过publish(host, container)方法实现端口映射,参数含义是"宿主机端口 → 容器端口"。
以项目自带的 Jetty 示例应用(见 JettyMain.java,它监听 8080 端口)为例:
task runJetty(type: DockerRun) { containerName = 'jetty-demo' publish '8080:8080' // 或者分开写:publish('8080', '8080') }执行./gradlew runJetty后,访问http://localhost:8080就能看到容器内 Jetty 返回的页面。在 NativeDockerClient.groovy 中可以看到,插件最终会把这些配置组装成docker run --publish 8080:8080 ...命令行执行。映射多个端口时,重复调用publish方法即可。
环境变量注入:env 方法
容器化应用常用环境变量传递数据库地址、密钥等配置。env(key, value)方法支持任意键值对注入:
task runApp(type: DockerRun) { containerName = 'my-app' env 'SPRING_PROFILES_ACTIVE', 'prod' env 'DB_HOST', '192.168.1.10' env 'DB_PORT', '3306' }对应生成的命令是docker run --env SPRING_PROFILES_ACTIVE=prod ...。测试代码 DockerRunTaskTest.groovy 验证了 env 配置会被完整传递给 Docker 客户端。这样每个环境(开发、测试、生产)只需切换不同的构建脚本配置,镜像本身完全一致,真正实现"一次构建、到处运行"。
数据卷挂载:volume 与 volumesFrom 方法
容器是临时的,数据库文件、日志等数据必须持久化。volume(host, container)方法把宿主机目录挂载进容器:
task runApp(type: DockerRun) { containerName = 'my-app' volume '/data/logs:/app/logs' volume '/data/config:/app/config:ro' }如果希望直接继承另一个容器挂载的数据卷,用volumesFrom更省事:
task runApp(type: DockerRun) { containerName = 'my-app' volumesFrom 'data-container' }这在多容器协作场景非常实用,例如日志采集容器共享应用容器的数据卷,无需重复指定路径。
后台运行与自动清理:detached 和 autoRemove
开发调试时希望前台运行、退出即删,用autoRemove = true;生产部署则通常后台运行,用detached = true:
// 开发模式:前台运行,退出自动清理 task devRun(type: DockerRun) { containerName = 'dev-app' autoRemove = true } // 生产模式:后台常驻 task prodRun(type: DockerRun) { containerName = 'prod-app' detached = true }需要注意一个关键限制:detached和autoRemove不能同时设为 true。这是插件有意设计的保护逻辑,见 NativeDockerClient.groovy,同时开启会直接抛出IllegalArgumentException,因为后台运行且退出即删的容器没有任何意义。
容器互联:link 方法
对于旧式容器互联需求,可以用link(containerName)让当前容器直接访问其他容器:
task runWeb(type: DockerRun) { containerName = 'web-app' link 'db-container' }对应生成docker run --link db-container ...。虽然是 Docker 早期的容器通信方式,但对于维护老项目的团队仍然实用。
完整示例:一个可落地的配置
把上面所有能力组合起来,就是一份完整的容器运行配置:
task runApp(type: DockerRun) { containerName = 'demo-app' detached = true publish '8080:8080' publish '8443:8443' env 'APP_ENV', 'production' env 'LOG_LEVEL', 'info' volume '/var/log/demo:/app/logs' link 'redis-cache' }执行./gradlew runApp,一条命令完成启动、端口映射、环境变量注入、数据卷挂载和容器互联,整个过程完全可重复、可审计。
写在最后
gradle-docker 的DockerRun任务把docker run的常见参数——端口映射、环境变量、数据卷——全部收拢进 Gradle 构建脚本,让容器运行成为构建流程的自然延伸。结合官方的 application 示例 和 Dockerfile.expected 一起阅读,你就能完整掌握从构建镜像到运行容器的全链路。下次构建完镜像,别忘了试试这个一行命令启动容器的高效方式。
【免费下载链接】gradle-dockerA Gradle plugin to build Docker images from the build script.项目地址: https://gitcode.com/gh_mirrors/gra/gradle-docker
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
