docker

docker篇

  • fabric8/java-alpine-openjdk8-jdk镜像构建容器问题
    • 具体思路
    • 解决方案
    • 再次启动
    • 总结

fabric8/java-alpine-openjdk8-jdk镜像构建容器问题

此镜像构建的容器,里面跑登录微服务,验证码显示不出来
但是通过宿主机启动,可以正常启动
刚开始极度的蒙圈,因为其他微服务都可以正常运行,难道只能通过宿主机跑这个微服务了吗?

重启了好几遍,看着同样的报错,内心很平静(f**k)
Okay!问题我们还是要解决的,不然难道空有一张帅气的脸嘛???
容器内启动报错如下:
docker_第1张图片docker_第2张图片
docker_第3张图片

具体思路

怀疑宿主机jdk环境和docker镜像jdk环境不一致;
https://github.com/docker-library/openjdk/issues/73
在上线网址观摩之后发现,相关的包可能会fontconfig在容器中调用。但是alpine镜像中的jdk环境好像没有这个fontconfig,因为JDK没有fontconfig不能加载出图片格式的文字。

解决方案

docker的alpine轻量级镜像包中没有fontconfig安装包,
只能在构建docker镜像的同时,将ttf-dejavu打包在镜像之中

在Dockerfile中添加以下内容
FROM fabric8/java-alpine-openjdk8-jdk

安装ttf-dejavu
RUN echo -e “https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main\n
https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/community” > /etc/apk/repositories

RUN apk --update add curl bash ttf-dejavu &&
rm -rf /var/cache/apk/*

构建新的镜像
在Dockerfile所在的目录输入命令:
docker build -t alpinejdk:3.2 .

再次启动

通过docker-compose编排工具启动
docker-compose.yaml
version: ‘3.1’
services:
mo-login:
image: alpinejdk:3.2
container_name: mo-login
privileged: true
restart: always
environment:
JAVA_OPTS: ‘-Xms256m -Xmx512m -Xss1024k’
network_mode: “host”
volumes:
- /opt/mo/mo-login/build/src:/opt/app
command: ["/bin/sh", “start.sh”]

启动并查看日志:docker-compose up -d ;docker-compose logs -f
服务启动正常,验证码可以正常出现
docker_第4张图片

总结

docker技术虽然有很多优点:轻量级,秒级启动,应用资源隔离,移植性超强。
负面弊端:譬如本次的jdk镜像环境不完整。

不过docker的强大之处只有用了才能体会到方便之处。俺已经深刻体会到以前的虚拟机部署环境,环境数据迁移的麻烦。

解决问题的同时,尽量不要耽误工作的进展,这是我先通过宿主机跑起来,将流程跟开发人员交接清楚之后,再继续的二次研究。感谢屏幕前你的观看,希望可以帮助到你。
youngfit

你可能感兴趣的:(docker篇)