• 踩过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可以解决这种问题。

  • 相关阅读:
    CSS3实战手册(第3版)(影印版)
    21世纪C语言(影印版)
    Spring Data:企业级Java的现代数据访问技术(影印版)
    Hive编程(影印版)
    iOS 6编程Cookbook(影印版)
    做自己——鬼脚七自媒体第一季
    放飞App:移动产品经理实战指南
    《推荐系统》+《推荐系统实践》
    步步惊“芯”——软核处理器内部设计分析
    ip的划分,超详细
  • 原文地址:https://www.cnblogs.com/lzmrex/p/12218476.html
Copyright © 2020-2023  润新知