【问题标题】:Pre-pull images in Docker in Docker (dind)在 Docker 中的 Docker 中预拉图像 (dind)
【发布时间】:2020-03-04 01:41:02
【问题描述】:

我正在运行一个 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 没有运行,但它应该让我知道我想要实现的目标。

【问题讨论】:

    标签: docker docker-in-docker


    【解决方案1】:

    你不能这样做。

    如果您查看docker:dind Dockerfile,它包含一个声明

    VOLUME /var/lib/docker
    

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

    【讨论】:

    • 嗨@David,你能解释一下为什么像我的回答那样提交容器不起作用
    • 当您启动 DinD 容器时,主机 Docker 将在容器 Docker 的 /var/lib/docker 树上挂载一个匿名卷。如果你docker pull 内部 Docker 中的图像,内容将被放入主机 Docker 的匿名卷中,而不是内部 Docker 的容器文件系统中。 docker commit 根本不考虑体积,所以你会得到一个没有预加载的未更改的图像。
    【解决方案2】:

    这里有一些方法可以实现这一点。

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

    例如,您可以使用文件夹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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-28
      • 2018-04-27
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      相关资源
      最近更新 更多