问题描述
想要加快构建速度,希望避免在每次提交时都需要安装git
和zip
工具,他想知道是否有已经包含这两个工具的最新镜像,并且想知道如何找到这些镜像。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
如果你想要查找一组镜像并进行调查,最好的方法是在一个新的容器中使用相关镜像,然后使用which
命令来查看这些镜像中是否已经包含了你需要的二进制文件。这样你可以快速地查看特定镜像是否已经在PATH
中包含了你需要的二进制文件。以下是一个示例:
docker run --rm ubuntu:latest which zip git
如果没有结果,则表示该镜像中不包含zip
和git
。但是,目前还没有一种方法可以发现一组镜像,因为没有一个镜像仓库提供文件清单。也就是说,一个镜像是一组tar文件,你可以提取一组文件/目录名称…但是,你仍然需要拉取整个镜像才能获取这些信息,所以运行上面的which
命令会更容易一些。虽然有一些工具可以探索镜像仓库提供的信息(如skopeo、doocker-ls、reg、manifest-tool等),但它们都不能完全满足你的需求,即”查找一个包含特定二进制文件的镜像的镜像仓库”。
方案2
有几种方法可以解决这个问题:
1. 创建自己的镜像,将其推送到Docker Hub,并使用docker run
命令运行该镜像,例如:
docker run yourimage git
- 使用已经发布的镜像,例如:
docker run dockerinpractice/docker-dev-tools-image git
- 使用Dockerfile将
git
添加到现有的镜像中,例如:
FROM alpine/git:1.0.7
RUN apk add --update zip
个人认为,在这种情况下,Docker是否是合适的工具还有待商榷。
方案3
如果你不想将镜像推送到Docker Hub,或者你在一个隔离的网络中,或者你经常这样做,你可以考虑设置自己的本地Docker仓库。以下是设置本地Docker仓库的简要步骤:
1. 获取/运行Docker仓库镜像(是的,仓库将在Docker内部运行):
docker run -d -p 5000:5000 --restart=always --name registry registry:2
- 构建你的镜像或使用现有的镜像:
docker tag ubuntu:16.04 localhost:5000/my-ubuntu
- 将该镜像推送到你的本地仓库:
docker push localhost:5000/my-ubuntu
完成后,你将能够像使用Docker Hub一样使用本地仓库;你可以删除你本地的”my-ubuntu”镜像副本,然后再次从本地仓库拉取它:
docker image remove ubuntu:16.04
docker image remove localhost:5000/my-ubuntu
docker pull localhost:5000/my-ubuntu
请注意,以上操作仅适用于本地仓库,如果你想要索引镜像中的文件,你可能需要使用一些第三方工具来提取镜像的文件列表。