Docker部署scala教程
手把手教你用Docker部署Scala应用——从Dockerfile到容器运行
为什么需要Docker部署Scala?
Scala应用通常依赖JVM和sbt构建工具,不同开发环境容易出现版本不兼容问题。
使用Docker部署Scala可以将应用及其依赖(JVM、sbt、库文件)打包成一个可移植的镜像,在任何支持Docker的服务器上以相同方式运行,极大减少环境配置成本。
环境准备清单
- 一台安装了Docker的Linux服务器(本文以CentOS 7为例,其他系统类似)
- Docker版本20.10以上(执行
docker --version检查) - 一个简单的Scala项目(包含build.sbt和main代码)
- 文本编辑器(如vim或nano)
如果还没有Scala项目,可以用以下示例:在任意目录新建HelloScala文件夹,里面创建build.sbt和src/main/scala/Hello.scala。
编写Dockerfile
在项目根目录下创建Dockerfile(无后缀名),内容如下:
# 第一阶段:使用官方sbt镜像编译Scala项目
FROM hseeberger/scala-sbt:11.0.12_1.5.5_2.13.6 AS builder
WORKDIR /app
COPY build.sbt ./
COPY src ./src
RUN sbt compile
# 第二阶段:使用轻量级JRE镜像运行
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /app/target/scala-2.13/classes ./classes
CMD ["java", "-cp", "classes", "Hello"]
说明:第一阶段用sbt compile生成class文件,第二阶段只复制class文件到精简JRE镜像,减小最终镜像体积。
如果你的Scala项目是打包成jar,可以修改为sbt assembly并复制jar。
构建并运行容器
- 构建镜像:在Dockerfile所在目录执行:
docker build -t scala-hello .
首次构建会下载基础镜像,耗时较长。
构建成功会显示Successfully tagged scala-hello:latest。
- 运行容器:
docker run --rm scala-hello
参数--rm表示容器退出后自动删除,适合测试。
如果看到Hello, Scala!(根据你的代码输出),说明Docker部署Scala成功。
验证与常见问题
- 验证容器状态:运行
docker ps -a查看所有容器,如果刚运行的容器已经退出但无报错,说明程序正常结束。 - 常见问题1:sbt编译超慢或失败
原因:国内网络访问Maven仓库慢。
解决方法:在build.sbt中添加镜像仓库或设置sbt代理。
例如在sbt命令前加-Dsbt.override.build.repos=true -Dsbt.repository.config=./repositories(需要准备repositories文件)。
- 常见问题2:镜像体积过大
使用多阶段构建(如上例)可大幅减小体积。
还可以改用adoptopenjdk:11-jre-hotspot等更小的基础镜像。
- 常见问题3:运行时报ClassNotFoundException
检查Dockerfile中复制class文件的路径是否正确。
在第二阶段执行ls classes查看文件。
避坑总结
- 务必使用多阶段构建:不要在最终镜像中保留sbt和源码,否则镜像会超过1GB。
- Dockerfile中注意WORKDIR和CMD的写法:CMD推荐使用JSON数组格式,避免被shell解析干扰。
- 如果Scala项目依赖外部配置:可以将配置文件通过
docker run -v挂载或打包进镜像,建议挂载方便修改。 - 首次构建耐心等待:sbt会下载大量依赖,建议在国内使用阿里云maven镜像加速。
按照以上步骤,你应该能够顺利地把Scala应用打包成Docker镜像并运行。
如果你遇到了本文未列出的问题,欢迎在评论区留言,我会帮你排查。