使用Docker运行java项目需要注意的glibc依赖库问题

转载自:https://blog.51cto.com/u_15329153/3758717

docker官方推荐java是基于glibc库,而alpine默认只提供mini libc,故需要安装glibc库

官方wiki: https://wiki.alpinelinux.org/wiki/Running_glibc_programs
安装: https://github.com/sgerrand/alpine-pkg-glibc

如下这些是官方提供的安装教程

InstallingThe current installation method for these packages is to pull them in using wget or curl and install the local file with apk:wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.34-r0/glibc-2.34-r0.apk
apk add glibc-2.34-r0.apkPlease Note⚠️ The URL of the public signing key has changed! ⚠️Any previous reference to https://raw.githubusercontent.com/sgerrand/alpine-pkg-glibc/master/sgerrand.rsa.pub should be updated with immediate effect to https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub.
Locales

结合自己自定义的docker镜像的Dockerfile文件,需要修改该文件:
原先Dockerfile文件内容如下:

FROM alpine:latest
MAINTAINER sandu <1103324414@qq.com>
COPY localtime /etc/localtime
COPY timezone /etc/timezone
RUN echo "https://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories
RUN echo "https://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories
RUN ["apk","update"]
RUN ["apk","add","curl"]
RUN ["apk","add","openjdk8-jre"]

单独运行alpine镜像,把这俩文件cp进去,然后安装,会发现有如下报错信息

# docker pull alpine:latest
# docker run -it -d --name alpine alpine:latest
# docker cp glibc-bin-2.34-r0.apk alpine:/tmp
# docker cp glibc-i18n-2.34-r0.apk alpine:/tmp# docker exec -it alpine /bin/sh
/# cd /tmp
/tmp # apk add glibc-bin-2.34-r0.apk
ERROR: glibc-bin-2.34-r0.apk: UNTRUSTED signature

签名问题不太好处理,看来这个办法行不通了。

采用直接在线上下载安装的方式:

# docker pull alpine:latest
# docker run -it --name alpine alpine:latest
/# cd /tmp
/tmp # wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
/tmp # wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.34-r0/glibc-2.34-r0.apk
/tmp # wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.34-r0/glibc-bin-2.34-r0.apk
/tmp # wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.34-r0/glibc-i18n-2.34-r0.apk
/tmp # apk add glibc-2.34-r0.apk glibc-bin-2.34-r0.apk glibc-i18n-2.34-r0.apk
/tmp # /usr/glibc-compat/bin/localedef -i en_US -f UTF-8 en_US.UTF-8
[error] character map file `UTF-8' not found: No such file or directory
[error] default character map file `ANSI_X3.4-1968' not found: No such file or directory

在这里又报字符串找不到的问题,那再换取其他办法。

第一种办法:直接使用含有glibc的alpine镜像,然后替换Dockerfile文件中的FROM alpine:latest

# 任选其一即可
docker pull docker.io/jeanblanchard/alpine-glibc:latest
docker pull jlesage/baseimage:alpine-3.7-glibc

第二种办法:先编译安装一个含有glibc的alpine镜像,Dockerfile文件如下

FROM alpine:3.10RUN ALPINE_GLIBC_BASE_URL="https://github.com/sgerrand/alpine-pkg-glibc/releases/download" && \ALPINE_GLIBC_PACKAGE_VERSION="2.27-r0" && \ALPINE_GLIBC_BASE_PACKAGE_FILENAME="glibc-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \ALPINE_GLIBC_BIN_PACKAGE_FILENAME="glibc-bin-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \ALPINE_GLIBC_I18N_PACKAGE_FILENAME="glibc-i18n-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \apk add --no-cache --virtual=.build-dependencies wget ca-certificates && \echo \"-----BEGIN PUBLIC KEY-----\MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApZ2u1KJKUu/fW4A25y9m\y70AGEa/J3Wi5ibNVGNn1gT1r0VfgeWd0pUybS4UmcHdiNzxJPgoWQhV2SSW1JYu\tOqKZF5QSN6X937PTUpNBjUvLtTQ1ve1fp39uf/lEXPpFpOPL88LKnDBgbh7wkCp\m2KzLVGChf83MS0ShL6G9EQIAUxLm99VpgRjwqTQ/KfzGtpke1wqws4au0Ab4qPY\KXvMLSPLUp7cfulWvhmZSegr5AdhNw5KNizPqCJT8ZrGvgHypXyiFvvAH5YRtSsc\Zvo9GI2e2MaZyo9/lvb+LbLEJZKEQckqRj4P26gmASrZEPStwc+yqy1ShHLA0j6m\1QIDAQAB\-----END PUBLIC KEY-----" | sed 's/   */\n/g' > "/etc/apk/keys/sgerrand.rsa.pub" && \wget \"$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \"$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \"$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \apk add --no-cache \"$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \"$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \"$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \\rm "/etc/apk/keys/sgerrand.rsa.pub" && \/usr/glibc-compat/bin/localedef --force --inputfile POSIX --charmap UTF-8 "$LANG" || true && \echo "export LANG=$LANG" > /etc/profile.d/locale.sh && \\apk del glibc-i18n && \\rm "/root/.wget-hsts" && \apk del .build-dependencies && \rm \"$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \"$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \"$ALPINE_GLIBC_I18N_PACKAGE_FILENAME"RUN  apk add -U tzdata curl \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& apk del tzdata \
&& rm -rf /var/cache/apk/*
docker build -t alpine_glibc:3.10 .

通过如上信息可以看到这样是可以编译成功的,但是有俩问题,一是需要从国外服务器拉取文件,这个速度比较慢,可以换成国内的阿里云下载地址,二是使用的apline和gilbc都不是最新版本的,可以更换成最新版本的再编译一个

FROM alpine:3.14.2#RUN echo "https://mirrors.aliyun.com/alpine/v3.10/main/" > /etc/apk/repositories
#RUN echo "https://mirrors.aliyun.com/alpine/v3.10/community/" >> /etc/apk/repositoriesRUN echo "https://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories
RUN echo "https://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositoriesRUN ALPINE_GLIBC_BASE_URL="https://github.com/sgerrand/alpine-pkg-glibc/releases/download" && \ALPINE_GLIBC_PACKAGE_VERSION="2.34-r0" && \ALPINE_GLIBC_BASE_PACKAGE_FILENAME="glibc-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \ALPINE_GLIBC_BIN_PACKAGE_FILENAME="glibc-bin-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \ALPINE_GLIBC_I18N_PACKAGE_FILENAME="glibc-i18n-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \apk add --no-cache --virtual=.build-dependencies wget ca-certificates && \echo \"-----BEGIN PUBLIC KEY-----\MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApZ2u1KJKUu/fW4A25y9m\y70AGEa/J3Wi5ibNVGNn1gT1r0VfgeWd0pUybS4UmcHdiNzxJPgoWQhV2SSW1JYu\tOqKZF5QSN6X937PTUpNBjUvLtTQ1ve1fp39uf/lEXPpFpOPL88LKnDBgbh7wkCp\m2KzLVGChf83MS0ShL6G9EQIAUxLm99VpgRjwqTQ/KfzGtpke1wqws4au0Ab4qPY\KXvMLSPLUp7cfulWvhmZSegr5AdhNw5KNizPqCJT8ZrGvgHypXyiFvvAH5YRtSsc\Zvo9GI2e2MaZyo9/lvb+LbLEJZKEQckqRj4P26gmASrZEPStwc+yqy1ShHLA0j6m\1QIDAQAB\-----END PUBLIC KEY-----" | sed 's/   */\n/g' > "/etc/apk/keys/sgerrand.rsa.pub" && \wget \"$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \"$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \"$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \apk add --no-cache \"$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \"$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \"$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \\rm "/etc/apk/keys/sgerrand.rsa.pub" && \/usr/glibc-compat/bin/localedef --force --inputfile POSIX --charmap UTF-8 "$LANG" || true && \echo "export LANG=$LANG" > /etc/profile.d/locale.sh && \\apk del glibc-i18n && \\rm "/root/.wget-hsts" && \apk del .build-dependencies && \rm \"$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \"$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \"$ALPINE_GLIBC_I18N_PACKAGE_FILENAME"RUN  apk add -U tzdata curl \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& apk del tzdata \
&& rm -rf /var/cache/apk/*
docker build -t alpine_glibc:3.14.2 -f Dockerfile_new .

注意,这个在编译的时候出现如下这个错误,不知道对后续使用这个有影响没,这个就有待后续研究了。

[error] character map file `UTF-8' not found: No such file or directory
[error] default character map file `ANSI_X3.4-1968' not found: No such file or directory

然后替换Dockerfile文件中的FROM alpine:latest即可

如上四个镜像大小比较

# docker image ls|grep glibc
alpine_glibc                                                        3.14.2              caafb8c6f7af        8 minutes ago       15.3MB
alpine_glibc                                                        3.10                19233ea6669d        26 minutes ago      14MB
jeanblanchard/alpine-glibc                                          latest              2e1bf678accc        9 days ago          13.2MB
jlesage/baseimage                                                   alpine-3.7-glibc    7bde9ce1bc13        5 months ago        22.6MB

考虑到后期维护以及镜像大小的因素,优先使用:jeanblanchard/alpine-glibc:latest

使用Docker运行java项目需要注意的glibc依赖库问题相关推荐

  1. centos8安装docker运行java文件

    本文由个人总结,如需转载使用请标明原著及原文地址 这里是基于我前一篇搭的centos8服务器做的,如果yum baseos源或appstream源有问题可以去看看前一篇 https://blog.cs ...

  2. Linux系统中后台运行java项目jar包指令

    Linux系统中后台运行java项目jar包指令 windows环境下后台运行jar包程序: https://blog.csdn.net/qq_36763419/article/details/109 ...

  3. linux安装docker部署java项目

    大家好,我是烤鸭: 分享一下linux上部署docker的javaweb项目 1.环境 linux centos 7.2 64-bit 系统 kernel 3.10+ 查看版本号 : uname -r ...

  4. docker 运行java程序_Docker:在容器中运行Java应用程序

    您可以使用Docker在特定的运行时环境中运行容器中的Java应用程序.本教程介绍如何创建Dockerfile,以便在OpenJDK 8的容器中运行简单的Java应用程序. 示例应用程序由一个Main ...

  5. Docker部署java项目(Dockerfile方式)

    Java 项目如何部署到Docker中? 如何将java项目部署到Docker中呢,这里以一个springboot为例 以下命令全部都是以linux为基础的 1. 首先找一个你熟悉的目录下创建一个目录 ...

  6. 创建和运行Java项目

    ---------siwuxie095 首先在左侧的工程管理面板 Package Explorer 中,右键->New->Java Project 以 Hello World 为例 一般情 ...

  7. eclipse怎样创建并运行java项目

    今天为大家介绍一下怎样创建java项目,以及怎样运行一个简单的java类,对myeclipse的功能很强大,大家可以继续深入的研究...... 工具/原料 电脑 myeclipse 方法/步骤 1 打 ...

  8. 使用cmd-命令运行Java项目

    这里你先说明一下,这里的java项目并不是简单地helloworld,而是一个完整的Java项目,又或者maven项目... 先说一下我做这件事情的缘由吧~~~ 本人最近需要一个每隔几分钟就循环提醒的 ...

  9. 怎么在本地运行java项目,eclipse怎么运行java web项目?

    Eclipse是用来做开发的自由集成开发环境,这也是很多java程序员会使用的开发环境,所以可以使用eclipse创建项目并运行java web项目,那eclipse怎么运行java web项目?接下 ...

最新文章

  1. 【原译】简单的Malloc实现
  2. PCA计算流程详解与实现(Python详细编码,全部测试正确,与sklearn完全一致,只有7行代码)
  3. mat opencv java_OpenCV Mat到JavaCV Mat转换
  4. 程序员容易不能生育?
  5. 史上最全企业数据产品选型对比(含数仓、报表、BI、中台、数据治理)
  6. docker 安装 sqlserver 数据库
  7. 读书笔记《Redis入门指南》
  8. linux删除文件历史如何查看,如何恢复误删除的Linux文件
  9. 机器学习领域著名的期刊与会议
  10. Panoramic 控件设计举例
  11. vue项目怎么修改项目名称
  12. 工业控制电气非标自动化设计安装调试PLC编程电路电气外包行业的前景预测与分析
  13. 教你一键制作纯净Win10系统安装盘
  14. 动画特效十五:网易新闻之头部导航切换效果
  15. chrome绿色版浏览器
  16. 【Redis】RedisCluster 批量删除key
  17. 百度/Google等搜索引擎的信息检索搜索技巧总结
  18. DTC设置控制$85服务
  19. oracle验证手机号sql,oracle判断手机号码是否合法
  20. 一次Linux中的木马病毒解决经历

热门文章

  1. Silverlight Telerik控件学习:数据录入、数据验证
  2. Android用GSon处理Json数据
  3. 浏览器兼容性问题汇总及解决方案
  4. 【Spring学习】spring注解自动注入bean
  5. ssh报错:Could not load host key:/etc/ssh/ssh_host_rsa_keyssh_host_ecdsa_keyssh_host_ed25519_key...
  6. 缓存依赖中cachedependency对象
  7. Bzoj 2749: [HAOI2012]外星人 欧拉函数,数论,线性筛
  8. vim配置文件~/.vimrc
  9. [Ubuntu]使用dict/dictd英文字典
  10. 对团队建设与管理的几点看法