• 踩过docker编码的坑


    最近碰到一个docker编码问题,调查过程的比较艰辛,写篇博客记录下。

    问题是这样的:某个项目发现乱码问题,Java代码显示的默认编码为acsii(System.out.println(Charset.defaultCharset().name()))。我们知道Java应用的默认编码依赖于Locale,于是登录到容器,运行locale命令,得到的结果是en_US.UTF8。 此时脑袋中就一堆的问号了。为什么Java获得的编码会和locale显示的不一致呢?这还是第一次碰到。

    后面就和负责生成docker 镜像的同事一起调查。docker file 内容如下:

    FROM artifactory.local/docker-virtual/centos/centos7.6/javaapp:stable
    USER root
    COPY ip.jar /opt/application/app.py
    COPY start.sh /opt/application/start.sh
    
    RUN  chown -R app:app /opt/application && 
         chmod -R 755 /opt/application
    RUN echo "export LANG=en_US.utf8" >> /etc/bashrc
    #ENV LANG en_US.UTF-8
    USER app
    
    ENTRYPOINT ["/opt/application/start.sh"]

    同时,我们做了以下尝试:

    1. 启动一个容器 -> 进入到容器中执行Java命令:java -jar test.jar,这个应用会打印编码=UTF-8。

    2. 通过生成docker image -> docker run <image>, 打印的编码为ascii。

    3. 在docker file中新增ENV LANG en_US.UTF-8, 编码等于UTF-8。

    结论:在docker file 中使用 export LANG=en_US.utf8这行命令实际是要登录之后才会起作用的,直接在docker file上并不起作用,这就是为什么第二种情况的编码为ascii,第一种情况是正常的。通过在docker file种添加ENV可以解决这种问题。

  • 相关阅读:
    bilibili 高并发实时弹幕系统的实现
    主流深度学习框架对比
    完整的视频直播系统
    一个简单的直播demo for java
    流媒体知识 wiki
    Entity Framework 6 暂停重试执行策略
    泛型的资源释放
    Entity Framework异步查询和保存
    Entity Framework中的连接管理
    了解Entity Framework中事务处理
  • 原文地址:https://www.cnblogs.com/lzmrex/p/12218476.html
Copyright © 2020-2023  润新知