alpine 镜像 java 日志中文问号乱码
程序员文章站
2023-09-28 14:44:39
0x00 前言 吾使用 alpine 作为基础镜像构建了 jdk8 镜像,为线上业务的 java 微服务架构提供支持,但是有容器运行的 java 服务中打印的日志中一旦出现中文,就会出现诸如以下的 ???? 的乱码: 以下是解决该问题的方法,转载自 github 中这个 "issues" 中的解决方 ......
0x00 前言
吾使用 alpine 作为基础镜像构建了 jdk8 镜像,为线上业务的 java 微服务架构提供支持,但是有容器运行的 java 服务中打印的日志中一旦出现中文,就会出现诸如以下的 ???? 的乱码:
以下是解决该问题的方法,转载自 github 中这个 中的解决方法。
0x01 解决
1、使用 alpine 构建镜像时,在 dockerfile 修改其语言环境:
from alpine:3.6 # ---not shown here--- # install language pack run apk --no-cache add ca-certificates wget && \ 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.25-r0/glibc-2.25-r0.apk && \ wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.25-r0/glibc-bin-2.25-r0.apk && \ wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.25-r0/glibc-i18n-2.25-r0.apk && \ apk add glibc-bin-2.25-r0.apk glibc-i18n-2.25-r0.apk glibc-2.25-r0.apk # iterate through all locale and install it # note that locale -a is not available in alpine linux, use `/usr/glibc-compat/bin/locale -a` instead copy ./locale.md /locale.md run cat locale.md | xargs -i /usr/glibc-compat/bin/localedef -i {} -f utf-8 {}.utf-8 # set the lang, you can also specify it as as environment variable through docker-compose.yml env lang=en_us.utf-8 \ language=en_us.utf-8 # --- not show here---
同级目录下创建 locale.md
文件,将以下内容拷贝入 locale.md
:
aa_dj aa_er aa_et af_za am_et an_es ar_ae ar_bh ar_dz ar_eg ar_in ar_iq ar_jo ar_kw ar_lb ar_ly ar_ma ar_om ar_qa ar_sa ar_sd ar_sy ar_tn ar_ye as_in ast_es ayc_pe az_az be_by bem_zm ber_dz ber_ma bg_bg bho_in bn_bd bn_in bo_cn bo_in br_fr brx_in bs_ba byn_er ca_ad ca_es ca_fr ca_it crh_ua csb_pl cs_cz cv_ru cy_gb da_dk de_at de_be de_ch de_de de_lu doi_in dv_mv dz_bt el_cy el_gr en_ag en_au en_bw en_ca en_dk en_gb en_hk en_ie en_in en_ng en_nz en_ph en_sg en_us en_za en_zm en_zw es_ar es_bo es_cl es_co es_cr es_cu es_do es_ec es_es es_gt es_hn es_mx es_ni es_pa es_pe es_pr es_py es_sv es_us es_uy es_ve et_ee eu_es fa_ir ff_sn fi_fi fil_ph fo_fo fr_be fr_ca fr_ch fr_fr fr_lu fur_it fy_de fy_nl ga_ie gd_gb gez_er gez_et gl_es gu_in gv_gb ha_ng he_il hi_in hne_in hr_hr hsb_de ht_ht hu_hu hy_am ia_fr id_id ig_ng ik_ca is_is it_ch it_it iu_ca ja_jp ka_ge kk_kz kl_gl km_kh kn_in kok_in ko_kr ks_in ku_tr kw_gb ky_kg lb_lu lg_ug li_be lij_it li_nl lo_la lt_lt lv_lv mag_in mai_in mg_mg mhr_ru mi_nz mk_mk ml_in mni_in mn_mn mr_in ms_my mt_mt my_mm nb_no nds_de nds_nl ne_np nhn_mx niu_nu niu_nz nl_aw nl_be nl_nl nn_no nr_za nso_za oc_fr om_et om_ke or_in os_ru pa_in pa_pk pl_pl ps_af pt_br pt_pt ro_ro ru_ru ru_ua rw_rw sa_in sat_in sc_it sd_in se_no shs_ca sid_et si_lk sk_sk sl_si so_dj so_et so_ke so_so sq_al sq_mk sr_me sr_rs ss_za st_za sv_fi sv_se sw_ke sw_tz szl_pl ta_in ta_lk te_in tg_tj th_th ti_er ti_et tig_er tk_tm tl_ph tn_za tr_cy tr_tr ts_za tt_ru ug_cn uk_ua unm_us ur_in ur_pk uz_uz ve_za vi_vn wa_be wae_ch wal_et wo_sn xh_za yi_us yo_ng yue_hk zh_cn zh_hk zh_sg zh_tw zu_za
这样构建出来的 alpine 镜像就是 en_us.utf-8 的编码环境
2、构建镜像
$ docker build -t utf8-alpine . ……
3、运行构建的镜像,查看编码环境
$ docker run -itd utf8-alpine sh $ docker exec -it d830c8e49b1c sh /opt # env language=en_us.utf-8 hostname=d830c8e49b1c shlvl=1 home=/root term=xterm path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/java/jdk/bin lang=en_us.utf-8 pwd=/opt java_home=/usr/java/jdk /opt # /usr/glibc-compat/bin/locale -a …… zh_cn.utf8 zh_hk.utf8 zh_sg.utf8 zh_tw.utf8 zu_za.utf8
修改完后 java 日志中的中文也已经正常显示:
上一篇: PHP分页类集锦