前言

拉了一个 maven 镜像,需要修改仓库源,发现没有编译工具,无法进行编译文件,只能先安装编译工具了。


系统平台

Ubuntu 20.04.4 LTS

Docker 无法执行 apt-get update 解决办法_maven

Docker 版本

Docker 无法执行 apt-get update 解决办法_maven_02

本地镜像

Docker 无法执行 apt-get update 解决办法_docker_03


修改报错

进入容器,修改配置文件,提示 bash: vim: command not found,如下图所示的操作步骤。

Docker 无法执行 apt-get update 解决办法_编译工具_04

找到 maven 安装的目录,进入 conf 目录下修改配置文件。

Docker 无法执行 apt-get update 解决办法_编译工具_05


root@5afde2b35db3:/usr/share/maven/conf#
root@5afde2b35db3:/usr/share/maven/conf# vim settings.xml
bash: vim: command not found
root@5afde2b35db3:/usr/share/maven/conf# vi settings.xml
bash: vi: command not found
root@5afde2b35db3:/usr/share/maven/conf# gedit settings.xml
bash: gedit: command not found
root@5afde2b35db3:/usr/share/maven/conf#
root@5afde2b35db3:/usr/share/maven/conf#

更新安装

没有编译工具,先进行系统更新,然后进行安装。

Docker 无法执行 apt-get update 解决办法_编译工具_06

看到上面的操作都报错,无法系统更新,无法进行安装,这又遇到了什么稀奇古怪的问题呢?

系统源没有修改过,也没有更新过,其他的镜像都可以进行安装,应该不会是源方面的问题,那就看看网络方面的问题。

先看看网络的 DNS 的配置

root@5afde2b35db3:/etc#
root@5afde2b35db3:/etc# cat resolv.conf
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients directly to
# all known uplink DNS servers. This file lists all configured search domains.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

nameserver 192.168.109.2
search localdomain
root@5afde2b35db3:/etc#
root@5afde2b35db3:/etc#

Docker 无法执行 apt-get update 解决办法_maven_07

发现是 DNS 配置有问题,需要修改 DNS 配置。

目前无法使用编译工具进行修改,那应该怎么修改操作呢?

退出容器,通过 run 指令进行修改吧。

root@scm:/etc/docker#
root@scm:/etc/docker#
root@scm:/etc/docker#
root@scm:/etc/docker# docker run -it --rm --dns 8.8.8.8 --dns 114.114.114.114 d34fd907f4b9 /bin/bash
root@4b617c129a93:/#
root@4b617c129a93:/#
root@4b617c129a93:/# cat /etc/resolv.conf
search localdomain
nameserver 8.8.8.8
nameserver 114.114.114.114
root@4b617c129a93:/#
root@4b617c129a93:/#
root@4b617c129a93:/# apt-get update
Get:1 http://security.debian.org/debian-security bullseye-security InRelease [44.1 kB]
Get:2 http://deb.debian.org/debian bullseye InRelease [116 kB]
Get:3 http://deb.debian.org/debian bullseye-updates InRelease [39.4 kB]
Get:4 http://security.debian.org/debian-security bullseye-security/main amd64 Packages [147 kB]
Get:5 http://deb.debian.org/debian bullseye/main amd64 Packages [8182 kB]
Get:6 http://deb.debian.org/debian bullseye-updates/main amd64 Packages [2596 B]
Fetched 8532 kB in 1min 1s (141 kB/s)
Reading package lists... Done
root@4b617c129a93:/#
root@4b617c129a93:/#
root@4b617c129a93:/#

可以看到通过 run 指令修改了 DNS 的配置,进入容器查看 DNS 配置,已修改成功了,再次执行更新指令

apt-get update 已经可以执行更新了

Docker 无法执行 apt-get update 解决办法_编译工具_08

执行更新,安装 vim 编译工具。

Docker 无法执行 apt-get update 解决办法_编译工具_09

可以看到都正常的执行了更新及安装了工具。


宿主机的 DNS 修改

配置文件如下:

# cat /etc/systemd/resolved.conf

Docker 无法执行 apt-get update 解决办法_docker_10

添加如下两行

DNS=114.114.114.114
DNS=8.8.8.8

Docker 无法执行 apt-get update 解决办法_编译工具_11

修改完成,执行启动。

# systemctl restart systemd-resolved.service

然后在查看一下状态

root@scm:/home/scm#
root@scm:/home/scm#
root@scm:/home/scm# systemd-resolve --status
Global
LLMNR setting: no
MulticastDNS setting: no
DNSOverTLS setting: no
DNSSEC setting: no
DNSSEC supported: no
Current DNS Server: 114.114.114.114
DNS Servers: 114.114.114.114
8.8.8.8
DNSSEC NTA: 10.in-addr.arpa
16.172.in-addr.arpa
31.172.in-addr.arpa
corp
d.f.ip6.arpa
home
internal
intranet
lan
local
private
test

Link 4 (docker0)
Current Scopes: none
DefaultRoute setting: no
LLMNR setting: yes
MulticastDNS setting: no
DNSOverTLS setting: no
DNSSEC setting: no
DNSSEC supported: no

Link 3 (br-4de519358d19)
Current Scopes: none
DefaultRoute setting: no
LLMNR setting: yes
MulticastDNS setting: no
DNSOverTLS setting: no
DNSSEC setting: no
DNSSEC supported: no

Link 2 (ens33)
Current Scopes: DNS
DefaultRoute setting: yes
LLMNR setting: yes
MulticastDNS setting: no
DNSOverTLS setting: no
DNSSEC setting: no
DNSSEC supported: no
Current DNS Server: 192.18.19.112
DNS Servers: 192.18.19.112
DNS Domain: localdomain
root@scm:/home/scm#
root@scm:/home/scm#

如下是备用的 DNS 配置,需要的也可以尝试:

Docker 无法执行 apt-get update 解决办法_编译工具_12

Docker 无法执行 apt-get update 解决办法_docker_13

配置了 DNS 后,pull 镜像的速度相当快。

Docker 无法执行 apt-get update 解决办法_docker_14

在执行一下更新指令

Docker 无法执行 apt-get update 解决办法_maven_15

可以看到宿主机也都能正常执行更新操作了。