Dockerfile编写总结

Dockerfile,是Docker三大核心概念(镜像image,容器container,仓库registry)之一,镜像的构建文件;在 dockerfile 文件所在的目录下面执行 docker build 命令,即可构建一个 image。

Dockerfile文件由一系列构建指令组成,docker build 命令会根据这些构建指令完成Docker镜像的构建,一条命令相当于Image的一层数据卷。

docker build命令会根据Dockerfile文件及上下文构建新Docker镜像。构建上下文是指Dockerfile所在的本地路径或一个URLGit仓库地址)。构建上下文环境会被递归处理,所以,构建所指定的路径还包括了子目录,而URL还包括了其中指定的子模块。

-t参数指定构建成后,镜像的仓库标签等;

如果想要构建出来的image存在多个仓库下,或使用多个镜像标签,就可以使用多个-t参数

构建缓存仅会使用本地父生成链上的镜像。如果不想使用本地缓存的镜像,也可以通过--cache-from指定缓存。指定后将再不使用本地生成的镜像链,而是从镜像仓库中下载;

Dockerfile文件中指令不区分大小写,但为了更易区分,约定使用大写形式。

文件中的第一条指令必须是FROMFROM指令用于指定一个基础镜像。

#开头的是注释

RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache

指令说明
FROM指定所创建镜像的基础镜像
MAINTAINER维护者信息
RUN运行命令
CMD指定启动容器时默认执行的命令
LABEL生成镜像的元数据标签信息
EXPOSE声明镜像内服务所监听的端口
ENV环境变量
ADD复制,若源为tar 文件,则会自动解压
COPY复制本地主机的数据,推荐使用
ENTRYPOINT镜像的默认入口
VOLUME创建数据卷挂载点
USER运行容器时的用户名或者UID
WORKDIR配置工作目录
ARG指定镜像内使用的参数(例如版本号信息)
ONBUILD配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令
STOPSIGNAL容器退出时的信号值
HEALTHCHECK如何进行健康检查
SHELL指定使用shell时的默认shell类型

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

FROM
该命令必须放置在我们命令的第一层,首先就会使用该命令。当然一个DokcerFile中存在多个镜像时,可以多次使用FROM命令;
语法:FROM <image>:<tag>  //tag没有的话默认是latest

MAINTAINER
用来制定维护者信息,也可以是作者信息

LABEL
构建生成的镜像的元数据标签,一个容器可以有多个LABEL文件。

ENV
设置环境变量,可以让其他命令来使用此参数。并且还有使用docker inspect 查看这个环境变量值。

ADD
复制命令,将文件复制到镜像中去;
语法:ADD ["<src>",... "<dest>"]
其中 src 可以使本地文件也可以是压缩文件还可以是url  ,dest  是容器内部的绝对路径,也可以是相对于工作目录的相对路径。

COPY
也是复制命令,不过该命令只能复制本地文件。

RUN
用来运行我们所需要的指令。该命令是构建容器时运行的命令以及提交命令行的结果
语法:
RUN command   //该命令是 直接跟shell命令个 在linux系统中默认 /bin/sh -C  windows中默认是 cmd /S /C  
RUN [“executable”,“param1”,“param2”] 函数调用 都一个参数类似可执行文件,后面是参数 使用exec 来执行的 
总的来说命令较长可以使用 \ 来换行。
RUN  [“/bin/bash”, “-c”, “echo hello”]。
RUN apt-get update && apt-get install -y x11vnc xvfb firefox

ENTRYPOINT
用来指定镜像的默认入口,也是启动的默认命令。语法:
1. ENTRYPOINT ["executable", "param1", "param2"]
2. ENTRYPOINT command param1 param2
与CMD的区别:

  • 首先ENTRYPOINT不会被运行的command命令覆盖,CMD指定的命令会被覆盖
  • 如果两者同时存在,当CMD命令不是一个完整的执行命令时,那么CMD的命令参数会被作为ENTRYPOINT的参数,只一个完整的命令时,谁在最后谁执行。

USER
用来指定运行容器时的用户名或者UID。

CMD
用法是启动容器时默认执行的命令。启动容器需要执行的参数,并且一个DockerFile文件中最好只有一个该命令参数。多个话会把最后一个作为最终的目标。
1. CMD ["executable","param1","param2"]
2. CMD ["param1","param2"]
3. CMD command param1 param2
参数执行与RUN 运行类似。引号要使用是双引号,原因是参数传递后 docker用来解析为一个json array

VOLUME
创建数据卷的挂载点,将容器内的文件或者其他容器中的文件挂载在该容器中。授权访问从容器内到宿主主机上的目录。语法:
VOLUME ["目录"]
1. VOLUME ["/home/log/"]
2. VOLUME /home/log
3. VOLUME /home/log /home/db
需要使用数据进行持久化需要该操作。容器使用的是AUFS文件系统。容器关闭的时候数据会丢失,那么数据持久化 就需要使用挂载点来操作。该命令创建的挂载点是无法指定主机上的目录,自动生成的。

WORKDIR
用来配置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效,如果目录不存在会创建,也可以设置多次。切换目录的操作,相对于之前的目录,相当于是Linux系统中的cd。
WORKDIR /home/ruiqi
WORKDIR data
RUN pwd
pwd执行的结果是//home/ruiqi/data
当然如果存在环境变量的值也可以 解析环境变量。

ARG
用来指定一些参数信息。当然该参数可以被 build时使用 --build-arg user =asdasda 指定参数

ONBUILD
当该镜像作为其他镜像的基础镜像时,所设定的命令才会执行。

EXPOSE
声明镜像内服务,即容器在运行时需要监听的端口。暴露给外部使用,加上-P 参数映射或者使用-p映射为指定端口。
// 映射容器私有端口80到公有端口8080
EXPOSE 80:8080
永远不要使用Dockerfile映射公有端口。不然你将可能只能运行一个容器化应用程序的实例。

STOPSIGNAL
容器退出的信号值,当容器退出的时候给系统发送什么样的指令

HEALTHCHECK
进行容器的健康检查。语法有两种:
1. HEALTHCHECK [OPTIONS] CMD command
2. HEALTHCHECK NONE
第一个的功能是在容器内部运行一个命令来检查容器的健康状况
第二个的功能是在基础镜像中取消健康检查命令
[OPTIONS]的选项支持以下三中选项:

  • --interval=DURATION 两次检查默认的时间间隔为30秒
  • --timeout=DURATION 健康检查命令运行超时时长,默认30秒
  • --retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3

注意:
HEALTHCHECK命令只能出现一次,出现多次,只有最后一个生效。
CMD后边的命令的返回值决定本次健康检查是否成功,具体的返回值如下:
0: success - 表示容器是健康的
1: unhealthy - 表示容器已经不能工作;
2: reserved - 保留值
例子:
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
健康检查命令是:curl -f http://localhost/ || exit 1
两次检查的间隔时间是5秒
命令超时时间为3秒

Dockerfile的一些建议

  • 不要开机初始化
  • 不要在构建中升级版本
  • 使用小型基础镜像,建议FROM alpine:3.3
  • 尽量使用格式一致的Dockerfile,这样能使用缓存
  • 不要在构建中升级版本,如在容器中apt-get upgrade
  • 使用特点的标签。如FROM debian:jeesie,而不是FROM debian
  • 常见的命令组合。如:apt-get update与atp-get install组合。此外使用\格式化成多行命令。这样能够最大程度的应用缓存。
  • 使用自己的基础镜像

 

参考:

https://itbilu.com/linux/docker/VyhM5wPuz.html

 

### 回答1: Dockerfile 是 Docker 容器的构建文件,它包含了创建 Docker 容器所需的所有指令和信息。 要编写 Dockerfile,你需要遵循以下步骤: 1. 在文本编辑器中新建一个文件,并将其命名为 Dockerfile。 2. 在 Dockerfile 中指定基础镜像,使用 `FROM` 关键字。例如: ``` FROM ubuntu:20.04 ``` 3. 可以使用 `RUN` 关键字执行命令来安装软件包、创建文件夹、下载文件等。例如: ``` RUN apt-get update && apt-get install -y nginx ``` 4. 使用 `COPY` 关键字将本地文件或文件夹复制到容器中。例如: ``` COPY /path/to/local/file.txt /path/to/container/file.txt ``` 5. 使用 `EXPOSE` 关键字指定容器对外暴露的端口。例如: ``` EXPOSE 80 ``` 6. 使用 `ENTRYPOINT` 关键字指定容器启动时运行的命令。例如: ``` ENTRYPOINT ["nginx", "-g", "daemon off;"] ``` 7. 保存 Dockerfile 并退出文本编辑器。 示例 Dockerfile: ``` FROM ubuntu:20.04 RUN apt-get update && apt-get install -y nginx COPY /path/to/local/file.txt /path/to/container/file.txt EXPOSE 80 ENTRYPOINT ["nginx", "-g", "daemon off;"] ``` 要使用 Dockerfile 构建 Docker 容器,你可以在终端中使用 `docker build` 命令。例如: ``` docker build -t my-image . ``` ### 回答2: Dockerfile是用于构建Docker镜像的脚本文件,它包含了一系列的指令和参数,用于定义构建镜像的步骤和配置。 编写Dockerfile的过程中,我们需要定义基于哪个基础镜像构建,可以选择官方提供的各种语言和操作系统的基础镜像。接着,我们可以使用COPY指令将本地文件或目录复制到镜像中,使用WORKDIR指定工作目录,RUN指令执行一些系统命令和安装软件的操作,并使用EXPOSE指令声明容器运行时的监听端口。 在编写Dockerfile时,我们还可以使用ENV指令设置环境变量,使用VOLUME指令指定容器中的挂载点,使用CMD或ENTRYPOINT指令定义容器启动时执行的命令或脚本。同时,我们还可以使用LABEL指令为镜像添加一些元数据,方便管理和标识。 编写Dockerfile的关键是要根据实际需求合理选择指令和参数,并按照正确的顺序和逻辑编写,以提高构建镜像的效率和稳定性。此外,使用Dockerfile还可以借助缓存机制,提高构建镜像的速度。 最后,在编写Dockerfile后,我们可以使用docker build命令来构建镜像,根据Dockerfile中的指令和参数,自动化地完成构建过程。构建完成后,我们可以使用docker run命令来创建并运行基于这个镜像的容器。 总结来说,编写Dockerfile是一个描述和定义镜像构建过程的重要步骤,可以帮助我们更好地管理和部署应用程序。通过合理编写Dockerfile,我们可以方便地构建出符合需求的Docker镜像,提高开发和部署的效率。 ### 回答3: 编写Dockerfile是为了定义和构建Docker镜像的文件。下面是一个简单的示例Dockerfile: ``` # 使用基础镜像 FROM ubuntu:latest # 设置工作目录 WORKDIR /app # 复制应用程序代码到容器中 COPY . /app # 安装应用程序需要的依赖 RUN apt-get update && apt-get install -y python3 # 设置环境变量 ENV APP_NAME myapp ENV PORT 8080 # 暴露容器端口 EXPOSE $PORT # 运行应用程序 CMD [ "python3", "app.py" ] ``` 以上是一个基于Ubuntu镜像的Dockerfile示例。它首先指定了所使用的基础镜像,然后设置了工作目录并将应用程序代码复制到容器中。接下来是安装所需的依赖,这里以安装Python3为例。然后设置了一些环境变量,例如应用程序的名称和所使用的端口号。最后,通过EXPOSE指令暴露容器的端口,并通过CMD指令运行应用程序。 编写Dockerfile时,可以根据具体的需求,选择合适的基础镜像、设置工作目录、复制文件、安装依赖、配置环境变量、暴露端口和运行应用程序等步骤。编写完成后,可以使用`docker build`命令根据Dockerfile构建镜像,并使用该镜像创建和运行容器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

johnny233

晚饭能不能加鸡腿就靠你了

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

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

打赏作者

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

抵扣说明:

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

余额充值