使用Docker运行java项目需要注意的glibc依赖库问题
使用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文件內容如下:
單獨運行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
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的使用Docker运行java项目需要注意的glibc依赖库问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Minio进阶
- 下一篇: IDEA使用技巧整理