4

我正在运行一个 docker-in-docker 容器,它总是使用相同的几个图像。我想将它们预先拉到我的 dind 容器中,这样我就不必在启动时拉它们。我怎么能做到这一点?

我正在考虑按照以下方式建立自己的形象

FROM docker:18.06.1-ce-dind

RUN apk update && \
    apk upgrade && \
    apk add bash

RUN docker pull pre-pulled-image:1.0.0

显然,上面的 Dockerfile 不会构建,因为在构建过程中 docker 没有运行,但它应该让我知道我想要实现什么。

4

2 回答 2

3

你不能这样做。

如果您查看docker:dindDockerfile它包含一个声明

VOLUME /var/lib/docker

这使得不可能在该目录树中创建具有任何不同内容的派生图像。(这与您无法使用预填充数据创建mysql或图像的原因相同。)postgresql

于 2019-11-07T13:37:37.237 回答
0

这是实现这一目标的一些方法。

这个想法是保存您要使用的图像,然后在容器启动过程中导入这些图像。

例如,您可以使用一个文件夹images来存储您的图像。

而且您必须使用自定义的入口点脚本来导入图像。

所以Dockerfile将是:

FROM docker:19.03-dind

RUN apk add --update --no-cache bash tini

COPY ./images /images
COPY ./entrypoint.sh /entrypoint.sh

ENTRYPOINT ["tini", "--", "/entrypoint.sh"]

tini需要在后台加载图像)

entrypoint.sh脚本:

#!/bin/bash

# Turn on bash's job control
set -m

# Start docker service in background
/usr/local/bin/dockerd-entrypoint.sh &

# Wait that the docker service is up
while ! docker info; do
  echo "Waiting docker..."
  sleep 3
done

# Import pre-installed images
for file in /images/*.tar; do
  docker load <$file
done

# Bring docker service back to foreground
fg %1

仅供参考,有关如何保存图像的示例:

docker pull instrumentisto/nmap
docker save instrumentisto/nmap >images/nmap.tar
于 2021-09-20T14:27:16.330 回答