测试基础 【Docker 实用技巧】动态切换国内外源

花菜 · 2023年05月09日 · 最后由 花菜 回复于 2023年05月09日 · 4761 次阅读

1、背景

在国内,docker build 的时候,如果没有修改为国内的源或者使用国内镜像(包括 yum,pip,apt-get,npm 等等),网络会非常的慢,有时候甚至用不了。

但是,如果在使用 Github Action docker build 时,机器是在美国,使用国内的源或者镜像,就会适得其反。

慢到令人发指.png

查看详细的 log,发现大部分时间消耗在这一层

# 更换apt源为阿里云镜像源,更新系统和安装一些基本软件包
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && \
    apt-get update && \
    apt-get install -y wget unzip openjdk-11-jdk ant

那么问题来了,怎么样优雅的实现,同一份 Dockerfile 在 Github Action 构建时就是用国外的源,本地开发就使用国内的源

2、ChatGPT 的方案

image.png

怎么说?使用 ARG 搭配 ENV 是一个不错的方案。

但在 Dockerfile 里面增加 if 判断似乎不是那么的优雅
但还有其他方案吗?

3、我的方案

3.1 本地构建

这里可以看到执行替换 apt 源为阿里云的
本地构建docker镜像

3.2 Github Action 构建

这里看到也执行了替换源,只不过是 debian 默认的源
Github Action构建docker镜像

整体的耗时耗时都降下来啦
image.png

3.3 实际方案

docker-compose args + Dockerfile ARG

image.png

含义解释:

DEBIAN_REPO: ${DEBIAN_REPO:-mirrors.aliyun.com}
PIP_INDEX_URL: ${PIP_INDEX_URL:-https://pypi.tuna.tsinghua.edu.cn/simple}

在 docker-compose.yml 里面定义了两个变量

  • DEBIAN_REPO,默认值是mirrors.aliyun.com
  • PIP_INDEX_URL,默认值是https://pypi.tuna.tsinghua.edu.cn/simple

在本地开发时,执行docker-compose -f docker-compose.yml up -d --build --remove-orphans(当然,我不会输入那么长命令,记不住;就算记得也会累死。你们会吗?我都是通过 Makefile 来自定义各种命令,最终效果是输入make up就能实现这个命令,看上面 3.1 的截图)构建的时候,

docker-compose 里面定义变量的默认值,会替覆盖掉 Dockerfile 的同名变量(DEBIAN_REPO 和 PIP_INDEX_URL)

这样一来,本地就能够使用国内的镜像和源啦

在 Github Action 构建时,直接使用 Dockerfile,没有传入参数,就直接使用默认的源。

完美解决问题~~

原文

共收到 1 条回复 时间 点赞

如果你什么更好用的 docker 技巧,欢迎留言探讨

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册