Dockerfile相关解析

Dockerfile常见命令

命令作用
FROM image_name:tag基础镜像
MAINTAINER user_name声明镜像的作者
ENV key value设置环境变量 (可以写多条)
RUN command编译镜像时运行的脚本(可以写多条)
CMD设置容器的启动命令(无法在运行中接收参数)
ENTRYPOINT设置容器的入口程序(可以在运行中接收参数)
ADD source_dir/file dest_dir/file将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir设置工作目录
ARG设置编译镜像时加入的参数
VOLUMN设置容器的挂载卷/目录

ENTRYPOINT和CMD的区别和联系

ENTRYPOINT ["/entrypoint.sh"]
CMD ["mysqld"]

在Dockerfile中,ENTRYPOINT和CMD一起定义了容器启动时执行的命令。ENTRYPOINT指定的是容器的入口点,它定义了一个命令的可执行程序,而CMD则提供了默认的参数或命令行。当容器启动时,CMD的参数将被添加到ENTRYPOINT命令的末尾
当容器启动时,实际执行的命令会是/entrypoint.sh mysqld。/entrypoint.sh是入口点脚本,它会被执行,然后mysqld作为参数传递给这个脚本。这样做的好处是,entrypoint.sh可以做一些预启动的配置或者环境准备,然后启动mysqld进程。
如果在运行Docker容器时显式提供了命令,如docker run -it myimage somecommand,那么somecommand将会替换CMD,但ENTRYPOINT仍然不变,所以实际执行的命令会是/entrypoint.sh somecommand。这意味着ENTRYPOINT通常是固定的,而CMD或运行时提供的命令可以被覆盖,以适应不同的运行需求。

HEALTHCHECK CMD /healthcheck.sh详解

HEALTHCHECK指令在Dockerfile中用于定义一个健康检查机制,用来定期检查容器内部的服务是否正常运行。CMD在这里是HEALTHCHECK指令的一部分,它指定了执行健康检查的命令或脚本。以下是HEALTHCHECK CMD /healthcheck.sh的详细解释:
HEALTHCHECK: Docker允许您通过HEALTHCHECK指令来定义一个检查容器健康状况的命令或脚本。这有助于监控容器的运行状态,确保服务可用,并且可以在服务出现问题时及时发出警告。
CMD: 在HEALTHCHECK中,CMD关键字后面跟的是健康检查的具体操作。在这种情况下,它是一个脚本/healthcheck.sh,这意味着容器会定期执行这个脚本来确认服务的健康状态。
/healthcheck.sh: 这是一个脚本文件,通常包含一些检查服务是否响应的命令,比如发送HTTP请求、检查数据库连接、执行SQL查询、检查文件系统状态等。这个脚本必须是容器内可执行的,并且应该返回一个表示服务健康状态的退出码:
0 表示服务健康,检查通过。
1 表示服务不健康,检查失败。
2 是保留的退出码,一般不应使用。
配置选项: 虽然在这个例子中没有显示,HEALTHCHECK指令还可以接受一些选项来定制检查的频率、超时时间等,例如:
–interval=SECONDS:设置健康检查之间的间隔时间。
–timeout=SECONDS:设置健康检查命令执行的超时时间。
–start-period=SECONDS:设置容器启动后多久才开始执行健康检查。
–retries=N:在判断健康检查失败之前,允许命令失败的次数。
执行流程: 当Docker运行这个容器时,它会按照指定的间隔执行/healthcheck.sh,并根据脚本的退出状态判断服务是否正常。如果连续几次健康检查失败,Docker可能会报告容器为“不健康”。
覆盖默认健康检查: 如果基础镜像已经定义了HEALTHCHECK,并且新的Dockerfile也包含HEALTHCHECK,那么新的HEALTHCHECK会覆盖基础镜像中的设置。
请注意,健康检查是Docker容器管理的一个重要组成部分,它可以帮助自动化监控和故障恢复流程。

# syntax=docker/dockerfile:1
- FROM golang:1.20-alpine AS base
+ ARG GO_VERSION=1.20
+ FROM golang:${GO_VERSION}-alpine AS base
WORKDIR /src
COPY . .
RUN go mod download
RUN go build -o /bin/client ./cmd/client
RUN go build -o /bin/server ./cmd/server
ENTRYPOINT [ "/bin/server" ]

文档解析:

  • syntax=docker/dockerfile:1

此注释是Dockerfile解析器指令。它指定要使用哪个版本的Dockerfile语法。该文件使用dockerfile:1语法,这是最佳实践:它确保您可以访问最新的Docker构建功能

  • FROM golang:1.20-alpine
    FROM指令使用了哪个基础版本

  • WORKDIR /src
    在容器内创建/src工作目录

  • COPY . .
    将生成上下文中的文件复制到容器中的工作目录例如:COPY demo2-0.0.1-SNAPSHOT.jar $app/app.jar

  • RUN go mod download
    执行命令,例如 RUN mkdir -p $app/logs

  • ENTRYPOINT [ “/bin/server” ]
    指定容器启动时要运行的命令。启动服务器进程。

build构建相关的

  • 镜像tag
  • build args
  • Dockerfile
  • build options
  • context
docker build --tag=buildme .
创建一个带有标签buildme的镜像。镜像标记是镜像的名称
--tag=buildme 指定镜像名称repository

在这里插入图片描述

镜像构建过程

Dockerfile指令的顺序很重要。Docker构建由一系列有序的构建指令组成。Dockerfile中的每条指令都大致转换为一个镜像层

缓存层

运行生成时,生成器会尝试重用早期生成中的层。如果图像的某个层未更改,则构建器会从构建缓存中拾取该层。如果某个图层自上次生成以来发生了更改,则必须重新生成该图层以及随后的所有图层。
上一节中的Dockerfile将所有项目文件复制到容器中(COPY.),然后在下面的步骤中下载应用程序依赖项(RUN go mod download)。如果要更改任何项目文件,则会使COPY层的缓存无效。它还将使后面所有层的缓存无效。
更小的基础镜像:
该图像的大小从150MB变为8.45MB。这是因为生成的图像只包含二进制文件,而不包含其他内容。

重建镜像

清楚缓存
docker builder prune -af

docker build --target=client --progress=plain . 2> log1.txt

target多阶段构建

–target=server
–target=client

构建参数

 # syntax=docker/dockerfile:1
- FROM golang:1.20-alpine AS base
+ ARG GO_VERSION=1.20
+ FROM golang:${GO_VERSION}-alpine AS base
docker build --build-arg="GO_VERSION=1.19" .
docker build --target=server --build-arg="APP_VERSION=v0.0.1" --tag=buildme-server .

JAVA_VERSION=openjdk:8
APP_VERSION=demo2-0.0.1-SNAPSHOT.jar
docker build --build-arg JAVA_VERSION=openjdk:8 --build-arg APP_VERSION=demo2-0.0.1-SNAPSHOT.jar --tag demo:frist .
docker run -ti --entrypoint /bin/sh demo:frist
我们在示例中使用的alpine基础容器没有bash,所以这是一个灰壳。它具有bash的一些但不是全部功能。
在这里插入图片描述
docker exec -ti myapp /bin/sh

ARG JAVA_VERSION=openjdk:8
ARG APP_VERSION=demo2-0.0.1-SNAPSHOT.jar
FROM ${JAVA_VERSION}-jdk-alpine
# 时区问题
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone

# 字体
COPY fonts /usr/share/fonts/simsun.ttc

ENV app=/app
WORKDIR $app
RUN mkdir -p $app/logs

COPY ${APP_VERSION} $app/app.jar
EXPOSE 5050
ENTRYPOINT ["java", "-server", "-Xms512M", "-Xmx512M", "-Djava.security.egd=file:/dev/./urandom", "-Dfile.encoding=UTF-8", "-XX:+HeapDumpOnOutOfMemoryError", "-Dspring.profiles.active=prod", "-jar", "/app/app.jar"]

ENTRYPOINT ["java","${JAVA_OPTS}","-jar","/app/app.jar"]
docker build -t myorg/myapp .
docker run -p 9000:9000 -e JAVA_OPTS=-Dserver.port=9000 myorg/myapp

build常用OPTIO

NS选项
docker build命令的使用格式:
docker build [OPTIONS] <PATH | URL | ->
–build-arg,设置构建时的环境变量
–no-cache,默认false。设置该选项,将不使用Build Cache构建镜像
–pull,默认false。设置该选项,总是尝试pull镜像的最新版本
–compress,默认false。设置该选项,将使用gzip压缩构建的上下文
–disable-content-trust,默认true。设置该选项,将对镜像进行验证
–file, -f,Dockerfile的完整路径,默认值为‘PATH/Dockerfile’
–isolation,默认–isolation=“default”,即Linux命名空间;其他还有process或hyperv
–label,为生成的镜像设置metadata
–squash,默认false。设置该选项,将新构建出的多个层压缩为一个新层,但是将无法在多个镜像之间共享新层;设置该选项,实际上是创建了新image,同时保留原有image。
–tag, -t,镜像的名字及tag,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个tag
–network,默认default。设置该选项,Set the networking mode for the RUN instructions during build
–quiet, -q ,默认false。设置该选项,Suppress the build output and print image ID on success
–force-rm,默认false。设置该选项,总是删除掉中间环节的容器
–rm,默认–rm=true,即整个构建过程成功后删除中间环节的容器

docker build --build-arg JAR_FILE=target/*.jar -t myorg/myapp .

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值