Dockerfile

84 阅读2分钟

Dockerfile

commit

基于一个现有容器,构建一个新的镜像
docker commit -a 'author' -m 'message' 容器名称/容器ID 镜像名称:tag

Dockerfile

1.先指定当前镜像的基础镜像是什么
FROM openjdk:8
2.描述镜像的作者以及联系方式(可选)
MAINTAINER dongsiheng<dsh5408@163.com>
3.镜像标签(可选)(可写多个)
LABEL version="1.0"
LABEL description="这是我的第一个dockerfile"
4.环境变量(可写多个)
ENV JAVA_ENV=dev
ENV APP_NAME=dongsiheng
ENV JAVA_ENV=dev APP_NAME=dongsiheng
5.在构建镜像时需要执行的shell
第一种写法直接写shell脚本
RUN ls -al
RUN mkdir /www/dsh
第二种写法类似函数调用,第一个参数为可执行文件,后面的都是参数
RUN ["可执行文件", "参数1", "参数2"]
6.将主机中的指定文件复制到容器中的目标位置,可以简单理解为cp命令
写法1
ADD /etc/hosts /etc/hosts第一个是src,第二个是dest
写法2
ADD ["/etc/hosts","/etc/hosts"]
7.设置容器中的工作目录,如果该目录不存在,(还有cd的效果)
WORKDIR /app
8.镜像数据绑定,将主机中的指定目录挂载到容器中
VOLUME ["/app"]
9.设置容器启动后要暴露的端口
EXPOSE 8080
10.CMD和ENTRYPOINT选择其一即可,作用是描述镜像构建完成后启动容器时默认执行的脚本
CMD ping 127.0.0.1
CMD ["sh","-c","ping 127.0.0.1"]
CMD和ENTRYPOINT相同点:在整个Dockerfile中只能设置一次,如果写了多次只有最后一次生效
ENTRYPOINT不会被运行容器时指定的命令覆盖,而CMD会被覆盖
如果同时设置了这两个命令,且CMD中只是参数,则CMD的内容会作为ENTRYPOINT的参数
如果两个都是完整命令,那么只会执行最后一个
ENTRYPOINT ping 127.0.0.1
ENTRYPOINT ["sh","-c","ping 127.0.0.1"]
11.设置变量,在镜像中定一个变量,当使用docker build命令构建镜像时,带上build-arg (name)=(value)来指定变量值,如果该变量名载dockerfile中不存在则会抛出一个警告
ARG jdk=8
FROM openjdk:$jdk
docker build -t build-arg jdk=8
12.后续容器中所有命令的操作都是以指定用户进行
RUN useradd dsh提前加好用户,避免用户不存在
USER dsh
13.表示在构建镜像时做某操作,不过不对当前dockerfile的镜像生效,而是对以当前镜像作为基础镜像的子镜像生效
ONBUILD RUN ls -al
14.SIOPSIGNAL

截屏2023-08-27 10.30.04.png
15.健康检查,每10秒检查容器,响应时间不超过3秒,最多尝试5次
HEALTHCHECK --interval=10 --timeout=3 --retries=5 CMD ps -ef|grep java || exit 1
0:success
1:unhealthy
2:reserved(保留值)