Docker Build

#Docker

1 1. 说明

  之前介绍过用 commit 的方式生成新的 Docker Image,今天介绍用 Build 方式做 image,Build 方式需要写一个配置文件,然后利用当前是已存在的 image,按照配置文件进行调整生成新的 image。

  相对来说,commit 方法更随意,我们用它将现场保存为 image,而 build image 生成的 image 更“干净”。

2 2. 基本操作

2.1 看当前环境

1
$ docker images

  看一下当前的 image,确定新的 image 是基于哪个 image,记下它的大版本号 (REPOSITORY) 和小版本号 (TAG)。

2.2 写配置文件 Dockerfile

1
$ vi Dockerfile

  写入以下内容,我这里是安装了一个新 python 包 pyecharts

1
2
FROM 基础大版本号:基础小版本号
RUN ["pip", "install", "pyecharts"]

2.3 BUILD 新的 Docker image

1
$ docker build -t 新的大版本号: 新的小版本号 .

此时 docker 会从当前目录”.”中读取 Dockerfile,并按其设置建立新的 image

2.4 查看是否 BUILD 成功

1
$ docker images

3 3. Dockerfile 常用命令

  • FROM: 制作 image 时依据的基本 image
  • RUN:制作 image 时执行的命令,一般在 Dockerfile 中多次出现
  • CMD:启动 docker 时执行的命令,在 Dockerfile 中只出现一次
  • ENV:设置环境变量
  • COPY:制作 image 时,将文件系统中的文件复制到 Docker 镜像中
  • WORKDIR:设置工作目录
  • EXPOSE:设置向外暴露的端口
  • VOLUME:设置容器与外界映射的目录

4 docker build 时设代理

4.1 使用 Docker 的系统级配置

Docker系统设置 中代理设置部分

5 BuildKit

BuildKit 是新的构建引擎,默认在 Docker 18.09+ 引入,用来替代旧的构建流程。

BuildKit 默认构建网络隔离,BuildKit 并不会自动继承 --build-arg 到网络请求。有时 DNS 或代理会失效,如果网络有问题导致卡死,可加参数 --network=host

新的 docker compose build 默认就启用了 BuildKit,不再需要手动设 DOCKER_BUILDKIT=1,如果显示已经不是从前的风格,说明自动开启了 DOCKER_BUILDKIT。

风格示例

1
2
#1 [internal] load build definition from Dockerfile
#2 ...

6 调试

6.1 在 Dockerfile 中查看环境变量

1
2
3
4
5
RUN echo "=== Proxy ===" && \
echo "HTTP_PROXY: ${HTTP_PROXY}" && \
echo "HTTPS_PROXY: ${HTTPS_PROXY}" && \
echo "NO_PROXY: ${NO_PROXY}" && \
echo "==================="

注意运行时加参数:--progress=plain,否则不显示 RUN 的结果,另外,可能还需要加参数 --no-cache,以免有些结果被缓存不再执行。

6.2 清理 build cache

1
$ docker builder prune -f

6.3 测试连接速度

1
$ curl -o /dev/null -s -w "连接时间: %{time_connect}s\n下载速度: %{speed_download} bytes/s\n总时间: %{time_total}s\n" http://xxx/

7 4. 参考

  • Docker 入门 02——Dockerfile 详解
    • http://www.cnblogs.com/sorex/p/6481407.html

看/sbin/init 由谁提供:

1
dpkg -L systemd-sysv | grep /sbin/init 

此外,“初始化”仅仅是 systemd 一个符号链接:

1
2
$ ls -lthd /sbin/init 
lrwxrwxrwx 1 root root 20 May 12 05:39 /sbin/init -> /lib/systemd/systemd