欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

alpine 镜像 java 日志中文问号乱码

程序员文章站 2023-09-28 14:44:39
0x00 前言 吾使用 alpine 作为基础镜像构建了 jdk8 镜像,为线上业务的 java 微服务架构提供支持,但是有容器运行的 java 服务中打印的日志中一旦出现中文,就会出现诸如以下的 ???? 的乱码: 以下是解决该问题的方法,转载自 github 中这个 "issues" 中的解决方 ......

0x00 前言

吾使用 alpine 作为基础镜像构建了 jdk8 镜像,为线上业务的 java 微服务架构提供支持,但是有容器运行的 java 服务中打印的日志中一旦出现中文,就会出现诸如以下的 ???? 的乱码:

alpine 镜像 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 日志中的中文也已经正常显示:

alpine 镜像 java 日志中文问号乱码