文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

使用Docker,部署比以往任何时候都可靠和快速。那Docker镜像的生成呢?容器没有任何银弹(Silver Bullet)。它将安装的不稳定性从部署周期转移到镜像生成周期。

我希望有一个通用的解决方案用于所有Docker镜像的验证。它应该能跨越不同的项目。这意味着更少的时间和精力。当然,省钱!

Verfy Docker Image Build By Docker-In-Docker

随着不断开发,我们偶尔需要通过如下方式重建Docker镜像:

  1. 安装新的软件包。
  2. 更新现有的软件包到一个新版本。
  3. 通过配置文件或类似的方式重新配置或调整服务。
第 1 段(可获 1.23 积分)

重建旧的镜像可能会在许多方面失败:

  1. 意料之外的手动步骤。如果我们不能纯粹从Dockerfile构建镜像,这将是令人沮丧的。
  2. 软件包的安装与最新版本可能会产生不兼容的问题。
    • 特定版本的软件包可能安装失败。他们可能已在代码库中被标记为过时。
  3. 依赖服务的中断等。

本文中查看更多相关说明。

为什么使用Docker-in-Docker?

我选择使用Docker-in-Docker(DIND)验证镜像。为什么?是的我知道有许多人强烈反对DIND(例如这个)。

以我多年的经验,我相信DIND非常有效,有如下原因:

  1. 特别容易设置和运行。从字面上看,我们只需要使用“Docker run”,然后执行测试。
  2. 在Docker主机不留痕迹或垃圾。如果使用共享主机,人们的日常工作可能会受到我们的测试的干扰。
第 2 段(可获 1.8 积分)

为了你的方便,我发布了一个Docker镜像(Dockerfile)。它需要一个预先安装的Docker Daemon。

# Pull docker image
docker pull denny/docker:v1.0

# Start a container to build images inside 
docker run -t -d --privileged -h dockerimages \
  --name docker-images denny/docker:v1.0 /usr/bin/dockerd

# Login to the container
docker exec -it docker-images bash

# Download a dockerfile for test purpose
wget -O /root/java_v1_0.dockerfile \
  https://raw.githubusercontent.com/DennyZhang/devops_docker_image/tag_v2/java/java_v1_0.dockerfile

# Build docker image inside current container
cd /root/
docker build -f java_v1_0.dockerfile -t denny/java:v1.0 --rm=true .

# Verify docker images
docker images | grep denny/java

DIND运行建议

  1. 不要用你的设备映射器做你的存储驱动。默认情况下,容器只能有10GB磁盘。是的,我们可以为大文件夹挂载卷。但这仍然不方便。
  2. 首先停止容器,然后销毁它。在测试结尾,确保我们停止容器,然后停止Docker,最后销毁环境。
  3. 当生成多个镜像时,顺序很重要。镜像B可能依赖镜像A。如果镜像A是公共的,我们还需要关心测试顺序吗?答案是需要的。我们需要基于最新的A来生成B,而不是Docker hub中的A的版本。
  4. 通过首先加载常用的镜像来加速镜像生成。预加载不仅仅节省了我们很多时间,同时减少了网络不稳定带来的假阴性。
第 3 段(可获 1.85 积分)
# Export docker image
docker save ubuntu:14.04 > ubuntu_1404.tar.gz
# Import docker image
docker load -i ubuntu_1404.tar.gz

敏感文件呢?

将一切打包作为一个Jenkins job。

这是一个Jenkins job(BuildAllDockerImages)。 你也可以在这里找到一个现场演示。

Verfy Docker Image Build By Docker-In-Docker

原文在这里。

第 4 段(可获 0.34 积分)

文章评论