目录

一、问题

二、解决

方法一、增加配置

方法二、映射配置

方法三、修改镜像

知识点延伸


一、问题

把使用 golang 开发的服务程序部署在以 alpine 为基础镜像的容器中,设置了 /etc/hosts,却没有生效,但是在终端中使用 ping 和 curl 域名都可以正常访问。

二、解决

出现上述问题的根本原因是 DNS 解析顺序不一致导致的,在 alpine 中,linux 系统默认跳过 hosts 配置,直接使用机器的 DNS 服务。因此,有如下三种解决方法。

方法一、增加配置

修改 NDS 解析顺序,先设置读 files,再设置读 dns,具体方法如下:

echo "hosts: files dns" > /etc/nsswitch.conf

方法二、映射配置

但是方法一会存在一个问题,就是容器重启后,配置文件就消失了。因此可以使用如下方式来规避这个问题,映射这个配置文件进去。

首先创建一个配置文件 nsswitch.conf ,内容如下:

hosts: files dns

然后,在 docker-compose.yml 中或者 docker run 中映射一下配置文件,参考方法如下:

version: '3'
services:
  test:
    image: tets-x86:latest
    container_name: test-x86
    restart: always
    network_mode: "host"
    volumes:
      - ./config/nsswitch.conf:/etc/nsswitch.conf

方法三、修改镜像

终极方法,从根本上解决这个问题,那就是从基础镜像上下功夫,打包服务镜像的时候,把配置文件加进入,Dockerfile 文件修改如下:

FROM alpine RUN echo "hosts: files dns" > /etc/nsswitch.conf

知识点延伸

alpine 是一个小而美的基础镜像包,最新的 latest 包大小是 5.53MB,时间是 2022年7月3日,截图如下:

作者简介:😄大家好,我是 Data-Mining(liuzhen007),是一名典型的音视频技术爱好者,前后就职于传统广电巨头和音视频互联网公司,具有丰富的音视频直播和点播相关经验,对 WebRTC、FFmpeg 和 Electron 有非常深入的了解。同时也是 CSDN 博客专家(博客之星)、华为云享专家(共创编辑、十佳博主)、51CTO社区编辑、InfoQ 签约作者,欢迎关注我分享更多干货!😄 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐