使用Dockerfile构建镜像


前言

本文将介绍Dockerfile文件结构以及如何使用Dockerfile构建镜像。


一、Dockerfile

Dockerfile示例

FROM node:11
MAINTAINER easydoc.net

# 复制代码
ADD . /app

# 设置容器启动后的默认运行目录
WORKDIR /app

# 运行命令,安装依赖
# RUN 命令可以有多个,但是可以用 && 连接多个命令来减少层级。
# 例如 RUN npm install && cd /app && mkdir logs
RUN npm install --registry=https://registry.npm.taobao.org

# CMD 指令只能一个,是容器启动后执行的命令,算是程序的入口。
# 如果还需要运行其他命令可以用 && 连接,也可以写成一个shell脚本去执行。
# 例如 CMD cd /app && ./start.sh
CMD node app.js

指令关键字详解

Dockerfile文件中包含的指令关键字有FROMMAINTAINERRUNCOPYADDCMDENTRYPOINTENVARGVOLUMEEXPOSEWORKDIRUSERHEALTHCHECKONBUILDLABEL

指令关键字作用
FROM定制的镜像都是基于 FROM 的镜像,后续的操作都是基于指定的基础镜像。如FROM Ubuntu
MAINTAINER镜像维护者姓名或邮箱地址。
RUN用于执行后面跟着的命令行命令。如RUN <命令行命令>RUN [“可执行文件”, “参数1”, “参数2”]
COPY复制指令,从上下文目录中复制文件或者目录到容器里指定路径。如COPY [–chown=:] <源路径1>… <目标路径>COPY [–chown=:] [“<源路径1>”,… “<目标路径>”]
ADDADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)
CMD类似于 RUN 指令,用于运行程序,为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束,但二者运行的时间点不同:CMD 在docker run 时运行;RUN 是在 docker build。如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。如CMD <shell 命令>CMD [“<可执行文件或命令>”,“<param1>”,“<param2>”,…]CMD [“<param1>”,“<param2>”,…]
ENTRYPOINT类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。如ENTRYPOINT [“<executeable>”,“<param1>”,“<param2>”,…]
ENV设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。如ENV <key> <value>ENV <key1>=<value1> <key2>=<value2>…
ARG构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。如ARG <参数名>[=<默认值>]
VOLUME定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。避免重要的数据,因容器重启而丢失,避免容器不断变大。在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。如VOLUME <路径>VOLUME [“<路径1>”, “<路径2>”…]
EXPOSE声明端口,帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射,在运行时使用随机端口映射时,会自动随机映射 EXPOSE 的端口。如EXPOSE <端口1> [<端口2>…]
WORKDIR指定工作目录,指定的工作目录会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。如WORKDIR <工作目录路径>
USER用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。如USER <用户名>[:<用户组>]
HEALTHCHECK用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
ONBUILD用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。如ONBUILD <其它指令>
LABELLABEL 指令用来以键值对的形式给镜像添加一些元数据(metadata)。如LABEL <key>=<value> <key>=<value> <key>=<value> …

二、使用Dockerfile构建镜像

1、构建镜像

编写好Dockerfile文件后,可以使用命令构建自己的镜像:

docker build -t <镜像名称> <Dockerfile文件所在目录,可以指定Dockerfile 的绝对路径>

2、查看镜像是否已构建

构建镜像命令执行完成后,查看本地是否有刚刚构建的镜像:

docker images

3、设置镜像标签

我们可以使用 docker tag 命令,为镜像添加一个新的标签:

docker tag <镜像ID> <镜像源名>:<新的标签名>

4、使用新的镜像来创建容器

我们可以使用 docker tag 命令,为镜像添加一个新的标签:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

具体用法可以查看博客《Docker入门简单使用》中的容器一节

总结

本文介绍了Dockerfile文件结构以及如何使用Dockerfile构建镜像。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值