「CONTAINER-IMAGE」- 构建镜像

通过 docker build 命令

通过 docker build 构建

构建上下文(Build Context)

=

Docker 为 Client/Server 架构,构建命令 docker build 实际由 Docker Server 负责执行,而 Docker Clinet 只负责发送请求;

因此参与构建的文件需要发送到 Docker Server 中,这样 Docker Server 才能进行构建,这些文件就是构建上下文(Build Context);

需要在命令行中指定 Build Context 信息,即要参与构建的文件。然后 Docker Client 会将这些文件打包并发送到 Docker Server 以进行构建。可以直接指定目录、归档文件、Git 仓库。如果使用 Git 仓库,Docker Client 会先拉取代码,然后打包上传;

潜在问题

#1 构建时间过长、内存网络资源占用较多
如果在 Build Context 中的内容占用较大空间,比如具有很多构建产出临时文件,那么全部上传到 Docker Server 时会增加网络传输时间以及消耗带宽内存资源

#2 镜像大小增加,影响启动速度
有些镜像在构建时,直接复制 Build Context 的内容(虽然应该由 Dockerfile 负责,但是通过 .dockerignore 可以避免),这将当之镜像大小增加,占用更多磁盘空间,并且还会影响启动速度;

#3 暴露敏感信息
某些内容属于敏感信息,比如在编译或加密前的明文信息,应避免直接复制到镜像中。应该始终将这些目录排除在外;

#4 构建缓存失效(潜在问题)
如果某些非必要文件经常变更,比如构建临时输出,当复制到 Docker Server 中时,那么在构建时将无法利用上次构建缓存;

解决办法

这些问题,通过控制发送到 Docker Server 中的内容,可以得到解决。这可以通过 .dockerignore 文件解决;

通过 docker commit 命令(不推荐)

类似于版本控制系统的提交命令,比如 git commit 命令;

创建容器 -> 修改 -> 提交

使用 docker commit 命令提交修改过的容器。该命令只提交与之前差异的部分;

还可以使用 -a 选项指定作者,选项 -m 指定提交信息;

使用 docker inspect 命令查看镜像信息;

访问 docker commit 查看 docker commit 命令的所有选项;

通过 docker import 导入

docker import | Docker Documentation
How to make docker image of host operating system which is running docker itself? – Stack Overflow

针对特定操作系统,我们需要将其制作为 Docker Image 以在容器中运行程序,或者将其作为基础镜像;

通过 docker import 实现:

# --------------------------------------------------------- // 准备镜像内容

cd /
tar -cpzf backup.tar.gz --exclude=/backup.tar.gz \
   --exclude=/proc --exclude=/tmp --exclude=/mnt \
   --exclude=/dev --exclude=/sys /   # 根据需要排除更多目录

# --------------------------------------------------------- // 制作新的镜像

cat backup.tar.gz | docker import - imageName:20190825
docker run -t -i imageName:20190825 /bin/bash

kaniko | Build Images In Kubernetes

https://github.com/GoogleContainerTools/kaniko

kaniko 是一个工具,用于在容器或 Kubernetes 集群中从 Dockerfile 构建容器镜像。

buildah | A tool that facilitates building OCI images.

https://github.com/containers/buildah