Dockerfile 参考

Dockerfile 参考

Docker可以自动读取Dockerfile中指令集后构建镜像,Dockerfile是一个文本文件,包含用户构建镜像需要的所有命令。用户使用docker build启动一个构建任务来自动执行一些命令行指令。

这个文档是描述怎么使用Dockerfile的命令,当阅读完之后就可以去进行最佳实践了。

Usage(用法)

docker build命令从Dockerfile(上下文)构建镜像,这个上下文是一个指定位置的路径URL,这个路径是你本地文件系统中的一个目录,URL是一个Git仓库地址。

上下文是递归处理的,所以路径包括任何子目录,URL包扣仓库和其子模块,以下使用一个当前目录作为上下文的构建命令:

$ docker build .

Sending build context to Docker daemon  6.51 MB
...

这个构建是运行的Docker守护进而不是CLI,构建程序要做的第一件事是将整个上下文(递归)发送到守护进程。在大多数情况下,最好将一个空目录作为上下文,仅将Dockerfile和Dockerfile所需的文件放到该目录下。

警告:
不要用root/目录作为Path,这会造成在构建时将硬盘的全部内容导入到Docker守护进程中。

在构建上下文中通过文件构建,Dockerfile会涉及到一系列指定的指令,例如COPY。为了提高构建的性能,用.dockerignore将不要的文件和目录从上下文中排除,在本问下下面有更多关于.dockerignore的说明。

通常Dockerfile会放在构建上下文的根目录中,当然在用docker build时可以用-f来指定构建的目录。

$ docker build -f /path/to/a/Dockerfile .

注:
如果Dockerfile里面有路径,则需要更改为和当前目录保持一致。例如Dockerfile中存在拷贝命令,xxxapp为Dockefile所在目录的子目录,如果切换到Dockerfile所在目录build无需更改,如果使用-f那么需要修改为当前执行命令目录一致,否则会提示COPY failed: stat /xxxx/xxx no such file or directory

COPY /xxxapp/ /app # 切换到Dockerfile所在目录构建命令
COPY /path/to/a/Dockerfile/xxxapp/ /app # 切换到上层目录/path/to/a/Dockerfile构建需更改保持一致

可以指定构建的新镜像的存储库和标记(注:即镜像名称)

$ docker build -t shykes/myapp .

如果有多个存储库添则加多个-t参数

$ docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .

在Docker守护进程执行Dockerfile中指令前,会进行初步验证Dockerfile,如果存在语法错误会返回响应的错误信息:

$ docker build -t test/myapp .

Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD

Docker守护进程是将Dockerfile中的指令一条一条的执行的,在最终输出你提供的ID名称作为新镜像前,如果有必要会将每天执行执行后的结果作为一个新镜像,不用担心Docker守护进程会自动的清除。(注:实际上清除不干净,所以在构建后经常会看到REPOSITORTY和TAG为<none>的镜像,通常用docker system prune清除或则手动清除)。

请注意,每条指令都是单独运行的,并导致创建新镜像,所以RUN cd /tmp不对对下一条指令造成影响。

只要有可能,Docker会尽可能的重用中间镜像(缓存),大大加快docker build的过程,下面表明在控制台输出中会利用缓存(Using cache)信息:

$ docker build -t svendowideit/ambassador .

Sending build context to Docker daemon 15.36 kB
Step 1/4 : FROM alpine:3.2
 ---> 31f630c65071
Step 2/4 : MAINTAINER SvenDowideit@home.org.au
 ---> Using cache
 ---> 2a1c91448f5f
Step 3/4 : RUN apk update &&      apk add socat &&        rm -r /var/cache/
 ---> Using cache
 ---> 21ed6e7fbb73
Step 4/4 : CMD env | grep _TCP= | (sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat -t 100000000 TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/' && echo wait) | sh
 ---> Using cache
 ---> 7ea8aef582cc
Successfully built 7ea8aef582cc

构建缓存仅仅用于本地具有福链的镜像,这意味着这些缓存镜像是之前构建产生的和使用docker load导入的。如果你希望使用指定的镜像作为构建缓存,你可以用--cache-from选项来指定,利用--cache-from指定的镜像不需要父链,可以从其他注册表(注:仓储)中拉取。

当你完成构建后,你可以考虑准备将你的镜像推送到注册表中

BuildKit(编译工具)

从18.09版本起,Docker支持由moby/buildkit项目提供用于执行构建的新后端,新的后端构建工具比旧的提供了很多很好的工具,例如:

  • 检测并跳过执行未使用的构建阶段
  • 并行构建独立的构建阶段
  • 仅增量传输构建上下文之间有更改的文件
  • 检测并跳过传输中上下文没有使用的文件
  • 使用具有许多新功能的外部Dockerfile实现
  • 避免其他API(中间镜像和容器)的副作用
  • 优先考虑构建缓存以进行自动修剪

要使用BuildKit backend,在执行docker build .之前你需要在CLI上设置环境变量DOCKER_BUILDKIT=1
要学习更对关于BuildKit backend构建实验性的Dockerfile语法,请阅读BuildKit仓储的文档

Format(格式)

以下关于Dockerfile的格式:

# Comment
INSTRUCTION arguments

/2021-03-18 第一部分///进行中

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值