【问题标题】:Mount-ing a CDROM repo during docker build在 docker build 期间挂载 CDROM 存储库
【发布时间】:2020-02-03 13:07:58
【问题描述】:

我正在构建一个 docker 映像,其中还涉及一个小的 yum install。我目前处于防火墙和访问控制使docker pullyum install 等非常慢的位置。

在我的例子中,它是一个使用 official image script 的 JRE8 docker 映像

我的问题:

构建映像只需要 2 个库 (gzip + tar),它们的组合只有 (132 kB + 865 kB)。但是 yum 里面的 docker build 脚本会首先下载超过 80 MB 的 repo 信息。虽然 80 MB 通常很小,但在这里,仅下载就需要 1 个多小时。如果我的同事需要构建,这将完全是浪费生产时间,更不用说沮丧了。

我知道的解决方法:

  • 因为这个镜像可能不需要完整的 yum 功能,我可以简单地抓取 *.rpm 文件,在容器脚本中 COPY 并使用 rpm -i 而不是 yum
  • 我可以保存构建的图像并在本地分发
  • 我还可以找到最接近 docker-hub 的镜像,但不是 yum

我的赌注:

  • 我有一个版本大致相同的 linux CD 副本
  • 我可以在 dockerfile 中添加命令以将 *.repo 重命名为 *.repo.old
  • 在容器内的 /etc/yum.repos.d/ 中添加一个 cdrom.repo
  • 使用 yum 从 CDROM 而不是 Internet 加载最常用的库

我的问题:

我无法弄清楚如何在不使用 httpd 的情况下从容器构建内部创建到 cdrom 存储库的挂载点。

在普通的 linux 中我这样做:

mkdir /cdrom
mount /dev/cdrom /cdrom

cat > /etc/yum.repos.d/cdrom.repo <<EOF
[cdrom]
name=CDROM Repo
baseurl=file:///cdrom
enabled=1
gpgcheck=1
gpgkey=file:///cdrom/RPM-GPG-KEY-oracle
EOF

任何帮助表示赞赏。

【问题讨论】:

  • 你有内部 docker 注册表吗?
  • @YuriG。没有内部 docker 注册表,使用附近的 docker 镜像进行了很多努力,尽管速度很慢。但这个问题与附近没有镜像的 yum 存储库有关。
  • 您是否尝试在主机上挂载 cdrom 并从挂载的文件夹中复制文件?
  • @YuriG。我可以这样做,但是如果存在包依赖项(尽管在这种特定情况下没有),rpm 执行将失败。

标签: docker mount


【解决方案1】:

Docker 容器无法访问主机设备。我认为您必须围绕 docker build 命令编写一个包装脚本才能执行以下操作

  1. 首先将 CD ROM 挂载到 docker 上下文中的目录(这将是 DockerFile 所在的子目录)。
  2. 使用此目录中的内容调用 docker build 命令
  3. 卸载 CD ROM。

所以,

cd docker_build_dir
mkdir cdrom
mount /dev/cdrom cdrom
docker build "$@" .
umount cdrom

在 DockerFile 中,您可以简单地执行以下操作:

RUN cd cdrom && rpm -ivh rpms_you_need

【讨论】:

  • 我要注意的唯一问题是,如果软件包具有依赖关系,则 rpm 执行将失败。无论如何,我现在可以找到依赖项,接受您的回答。
猜你喜欢
  • 2015-09-03
  • 2018-01-21
  • 2018-05-20
  • 2018-12-30
  • 2020-03-27
  • 2013-06-30
  • 2017-10-08
  • 2020-06-29
  • 1970-01-01
相关资源
最近更新 更多