一、前言

咱搞 Docker Compose 项目的时候,常常会碰到要给 apt 做配置的情况。要是每次构建容器都得重新配置,那可太麻烦了。今天就来聊聊怎么让 apt 配置持久化,避免重复劳动。咱会用到自定义源配置文件、挂载卷和镜像定制这几种方法,下面就一个一个来说。

二、应用场景

在 Docker Compose 项目里,很多时候我们要在容器里安装软件包。默认的 apt 源可能速度慢,或者有些特定的软件包只能从特定的源获取。这时候就需要配置 apt 源了。比如说,我们要搭建一个基于 Ubuntu 的开发环境容器,里面要安装 Python、Node.js 等开发工具,要是不配置合适的 apt 源,安装过程可能会非常慢,甚至失败。还有,当我们有多个容器都需要相同的 apt 配置时,如果每个容器都单独配置,不仅麻烦,还容易出错。所以,让 apt 配置持久化就很有必要了。

三、自定义源配置文件

3.1 原理

简单来说,就是我们自己创建一个包含 apt 源配置信息的文件,然后把这个文件放到容器里该放的地方,这样容器启动的时候就会使用我们自定义的源了。

3.2 示例(Docker 技术栈)

# 首先,在本地创建一个自定义的 apt 源配置文件,比如叫 my-apt-source.list
# 这里以使用阿里云的 Ubuntu 20.04 源为例
cat << EOF > my-apt-source.list
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
EOF

# 然后创建一个 Dockerfile
cat << EOF > Dockerfile
# 使用 Ubuntu 20.04 作为基础镜像
FROM ubuntu:20.04

# 把本地的自定义源配置文件复制到容器里的 /etc/apt/sources.list.d/ 目录下
COPY my-apt-source.list /etc/apt/sources.list.d/

# 更新 apt 缓存
RUN apt-get update
EOF

# 构建镜像
docker build -t my-ubuntu-image .

3.3 优缺点

优点

  • 简单直接,只需要创建一个配置文件,然后复制到容器里就行,不需要复杂的操作。
  • 可以灵活定制 apt 源,根据自己的需求选择合适的源。

缺点

  • 如果配置文件有问题,可能会导致 apt 更新失败,需要仔细检查配置文件的内容。
  • 每次修改配置文件都需要重新构建镜像。

3.4 注意事项

  • 要确保自定义的源配置文件格式正确,不然 apt 可能无法正常解析。
  • 不同的 Linux 发行版和版本,apt 源的格式可能会有所不同,要根据实际情况调整。

四、挂载卷

4.1 原理

挂载卷就是把本地的一个目录或者文件挂载到容器里,这样容器就可以直接访问本地的内容。我们把包含 apt 配置的文件或目录挂载到容器里的相关位置,就可以实现 apt 配置的持久化。

4.2 示例(Docker Compose 技术栈)

version: '3'
services:
  my-service:
    image: ubuntu:20.04
    volumes:
      # 把本地的 my-apt-source.list 文件挂载到容器的 /etc/apt/sources.list.d/ 目录下
      - ./my-apt-source.list:/etc/apt/sources.list.d/my-apt-source.list
    command: bash -c "apt-get update && apt-get install -y python3"

3.3 优缺点

优点

  • 不需要重新构建镜像,只需要修改本地的配置文件,容器就可以立即使用新的配置。
  • 可以在不同的容器之间共享同一个配置文件,提高了配置的复用性。

缺点

  • 如果本地的配置文件被误删除或者修改,容器里的配置也会受到影响。
  • 需要在 Docker Compose 文件里明确指定挂载卷,增加了配置的复杂度。

3.4 注意事项

  • 要确保本地的配置文件路径和容器里的挂载路径正确,不然可能会挂载失败。
  • 如果挂载的是目录,要注意目录的权限问题,确保容器有足够的权限访问目录里的文件。

五、镜像定制

5.1 原理

镜像定制就是在基础镜像的基础上,添加我们自己的配置和软件。我们可以在构建镜像的时候,把 apt 配置信息写进 Dockerfile 里,这样构建出来的镜像就已经包含了我们想要的 apt 配置。

5.2 示例(Docker 技术栈)

# 创建一个 Dockerfile
cat << EOF > Dockerfile
# 使用 Ubuntu 20.04 作为基础镜像
FROM ubuntu:20.04

# 备份默认的 apt 源配置文件
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak

# 创建一个新的 apt 源配置文件
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse" > /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse" >> /etc/apt/sources.list

# 更新 apt 缓存
RUN apt-get update
EOF

# 构建镜像
docker build -t my-custom-ubuntu-image .

3.3 优缺点

优点

  • 构建出来的镜像已经包含了 apt 配置,使用这个镜像创建容器时,不需要再进行额外的配置。
  • 可以保证所有使用这个镜像的容器都有相同的 apt 配置,提高了一致性。

缺点

  • 每次修改 apt 配置都需要重新构建镜像,构建过程可能会比较耗时。
  • 如果镜像构建失败,需要检查 Dockerfile 里的配置是否正确。

3.4 注意事项

  • 在 Dockerfile 里写 apt 配置时,要注意语法和格式,避免出现错误。
  • 构建镜像时,要确保网络连接正常,不然可能无法下载 apt 源的信息。

六、总结

通过自定义源配置文件、挂载卷和镜像定制这三种方法,我们可以实现 Docker Compose 项目中 apt 配置的持久化,避免重复配置。自定义源配置文件适合简单的定制,挂载卷适合需要频繁修改配置的场景,而镜像定制则适合对一致性要求较高的情况。在实际应用中,我们可以根据具体的需求选择合适的方法。同时,要注意每种方法的优缺点和注意事项,这样才能更好地使用这些技巧。