通过 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