Dockerfile入门

介绍

直白的讲Dockerfile文件就是用来介绍如何构建镜像的说明。文件一般开始会指定一个基础镜像用来构建新的镜像,例如,如果构建基于python的API,则可以使用由安装了python的Linux操作系统组成的基本映像。

除了指定基本镜像之外还有其它的一些指令辅助构建镜。这些指令的功能目的

  • 在容器中设置环境变量
  • 暴露镜像的端口
  • 拷贝文件到镜像中
  • 需要安装的依赖
  • 执行的命令,用来启动容器服务(例如 yarn start 用来启动Node.js API)
  • 更多...

样例

构建Node api的镜像

# 指定基础镜像
FROM node:12.16.1-alpine3.11
# 安装 Node.js API 所需的依赖
RUN apk add --no-cache make g++
# 指定镜像暴露的端口 3000
EXPOSE 3000
# 指定工作目录
WORKDIR /usr/src/app
# 拷贝本地所有的资源至Docker容器工作目录
COPY . .
# 使用yarn 安装NPM依赖
RUN yarn install
# 指定启动API的命令
CMD [ "yarn", "start" ]

指令列表

FROM指定基础镜像
RUN执行命令在新的镜像层
CMD在容器中执行的命令
EXPOSE暴露端口
ENV设置环境变量
COPY拷贝本地文件和目录至镜像
ADD功能更丰富的添加拷贝指令,COPY优先于ADD
ENTRYPOINT定义容器的执行
VOLUME定义镜像中的某个目录为容器卷,会随机生成一个容器卷名
WORKDIR工作目录
ARG定义了可以通过docker build --build-arg命令传递并在Dockerfile中使用的变量。

CMD和ENTRYPOINT 的区别

共同点:都可以作为容器启动命令

差异点以及融合

CMD

三个指令的形式

CMD ["executable","param1","param2"] (exec形式,首选形式)
CMD ["param1","param2"] (作为ENTRYPOINT的默认参数)
CMD command param1 param2 (shell 形式)

在Dockerfile文件中只能有一个CMD指令说明,如果有多个生效的是最后一个。

CMD 的角色是用来提供容器启动默认命令,当声明了ENTRYPOINT指令CMD则会被忽略(既生瑜何生亮)。

如果CMD被用来提供默认参数为ENTRYPOINT,CMD和ENTRYPOINT应该被指定为JSON数组的形式。

注意:执行形式会被解析成json数组,这就意味着你必须使用双引号,而不是单引号。(ps:这个地方是强制规定,我的理解是在shell中单引号为强引用而双引号则是若引用有关)

ENTRYPOINT

ENTRYPOINT 有两种格式

ENTRYPOINT ["executable","param1","param2"]  (exec 格式,被作为首先)
ENTRYPOINT command param1 param2  (shell 格式)

 

总结下一般该怎么使用:一般还是会用entrypoint的中括号形式作为docker 容器启动以后的默认执行命令,里面放的是不变的部分,可变部分比如命令参数可以使用cmd的形式提供默认版本,也就是run里面没有任何参数时使用的默认参数。如果我们想用默认参数,就直接run,否则想用其他参数,就run 里面加参数。

COPY 和 ADD的区别

COPY

用来拷贝文件或者目录至容器

两种格式

COPY [--chown=<user>:<group>]  <src>...<dest>
COPY [--chown=<user>:<group>]  ["<src>",..."<dest>"] (推荐)

ADD

不仅可以拷贝文件或者目录,还可以将远程URL所对应的文件或目录,作为资源复制到镜像文件系统。

所以,可以认为ADD是增强版的COPY,支持将远程URL的资源加入到镜像的文件系统。

两种格式

ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

说明,

1)对于从远程URL获取资源的情况,由于ADD指令不支持认证,如果从远程获取资源需要认证,则只能使用RUN wget或RUN curl替代。
另外,如果源路径的资源发生变化,则该ADD指令将使Docker Cache失效,Dockerfile中后续的所有指令都不能使用缓存。因此尽量将ADD指令放在Dockerfile的后面。

2)COPY是ADD的一种简化版本,目的在于满足大多数人“复制文件到容器”的需求,另外ADD还支持拷贝压缩文件至容器进行解压当然也不是全部都解压这个地方有句话对此有说明,

Currently the ADD command is IMO far too magical. It can add local and remote files. It will sometimes untar a file and it will sometimes not untar a file. If a file is a tarball that you want to copy, you accidentally untar it. If the file is a tarball in some unrecognized compressed format that you want to untar, you accidentally copy it. - amluto

翻译一下

目前ADD命令在我看来太神奇了。它可以添加本地和远程文件。它有时会解压缩一个文件,有时不会解压缩一个文件。如果一个文件是您想要复制的tar文件,那么您会不小心解压缩它。如果该文件是以某种无法识别的压缩格式的tar文件,并且希望解压缩,则会意外地复制它。——amluto

参考

https://docs.docker.com/engine/reference/builder/#add

https://www.robertcooper.me/docker-guide#dockerfile

https://blog.csdn.net/taiyangdao/article/details/73222601

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独步秋风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值