Dockerfile文件,自创镜像
- 一、概念:
- 二、案例:
- 1.先创建一个Dockerfile文件
- 2.编写内容
- 3.构建镜像
- 4.运行
- 三、指令:
- FROM:
- MAINTAINER:
- LABEL:
- RUN:
- CMD:
- ENTRYPOINT:
- ARG:
- ENV:
- ADD:
- COPY:
- USER:
- WORKDIR
- VOLUME:
- EXPOSE:
- HEALTHCHECK:
- 多阶段构建
- 案例1:
- 1.先在项目下创建Dockerfile(保证Dockerfile和项目在同一个文件夹)
- 2.先上传Java项目到服务器
- 3.进入项目下,可查看
- 4.修改Dockerfile文件,可以全部复制使用
- 5.配置dockerignore
- 6.构建镜像:docker build -t demo:java
- 7.启动:docker run -d -P demo:java
- 案例2:springboot-java 的Dockerfile写法
一、概念:
Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。一般而言,Dockerfile可以分为四部分:
- 基础镜像信息 – FROM
- 维护者信息 – LABEL
- 镜像操作指令 --RUN
- 启动时执行指令 – CMD
官方文档:https://docs.docker.com/engine/reference/builder/
二、案例:
1.先创建一个Dockerfile文件
vi Dockerfile文件名
2.编写内容
FROM alpine
LABEL maintainer=wfl
ENV param='Dockerfile'
RUN echo ${param}
CMD ["baidu.com"]
ENTRYPOINT ["ping"]
3.构建镜像
docker build -t 镜像名:tag -f Dockerfile文件名 .
docker build -t 镜像名:tag -f Dockerfile文件名 /指定目录
docker images 镜像名
4.运行
docker run -it 镜像名:tag
docker run -d 镜像名:tag
docker run -d -p 83:80 镜像名:tag
三、指令:
FROM:
指定基础镜像,
apline、slim、ubuntu等基础小镜像
scratch镜像是一个空镜像,常用于多阶段构建
MAINTAINER:
指定作者信息,已经过时,可以使用LABEL命令来替代
LABEL:
标注镜像的一些说明信息
案例:
LABEL label1="value" label2="value"
RUN:
镜像构建时运行命令
shell形式和exec形式
- shell 是 /bin/sh -c <command>的方式
- exec [“/bin/sh”,“-c”,command] 的方式 ,exec 默认方式不会进行变量替换
RUN没有上下文关系,RUN cd /dest && ls -l 和 RUN cd /dest RUN ls -l 是不同的命令
两种语法:
RUN <command> ( shell 形式)
RUN ["executable", "param1", "param2"] ( exec 形式)
三种案例写法:
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
RUN ["/bin/bash", "-c", "echo $HOME"]
案例:
ENV param='Dockerfile'
RUN echo $param
RUN ["echo","$param"]
CMD:
容器启动时会运行的命令,可以被修改
CMD 的三种写法:
- CMD [“executable”,“param1”,“param2”] ( exec 方式, 首选方式)
- CMD [“param1”,“param2”] (为ENTRYPOINT提供默认参数)
- CMD command param1 param2 ( shell 形式)
注意:
- 多个CMD,只有最后一个CMD才会生效;
- CMD的主要目的是为执行中的容器提供默认值。 这些默认值可以包含可执行文件,也可以省略可执行文件。
CMD ping baidu.com
CMD ["ping","baidu.com"]
CMD ["bin/sh","-c","ping baidu.com"]
docker run -it 镜像名:tag ping github.com
CMD ["baidu.com"]
ENTRYPOINT ["ping"]
ENTRYPOINT:
容器启动入口,不可以修改;多个ENTRYPOINT,只有最后一个ENTRYPOINT才会生效
两种写法:
- ENTRYPOINT [“executable”, “param1”, “param2”] ( exec 方式, 首选方式)
- ENTRYPOINT command param1 param2 (shell 形式)
ENTRYPOINT ping baidu.com
ARG:
定义变量,使用–build-arg = 传递,docker build命令会将其传递给构建器。
--build-arg:指定参数会覆盖Dockerfile中指定的同名参数,如果用户指定了未在Dockerfile中定义的构建参数 ,则构建会输出警告 。
ARG只在构建期有效,运行期无效。
定义后才生效
ARG param="默认值"
ARG param1="默认值"
RUN echo $param
RUN echo $param1
docker build --build-arg param=Dockerfile1 -t 镜像名:tag -f Dockerfile名 .
ENV:
指定环境变量,可以在docker run的时候使用-e改变value
ENV param='Dockerfile'
RUN echo $param
CMD echo $param
docker run -it -e param="aaa" 镜像名:tag
ADD:
复制指定的src路径下的内容到容器中的dest路径下,自动下载远程文件,压缩包自动解压的功能。
src 路径必须在构建的上下文中; 不能使用 …/xx /xx 这种方式,docker构建的第一步是将上下文目录(和子目录)发送到docker守护程序。
src 是URL,那么
- dest 不以斜杠结尾,则从URL下载文件并将其复制到 dest 。
- dest 以斜杠结尾,将自动推断出url的名字(保留最后一部分),保存到 dest。
src 是目录,则将复制目录的整个内容,包括文件系统元数据。
FROM alpine
ADD 路径/文件夹 /dest
ADD 路径/文件夹 /dest/
RUN cd /dest && ls -l
COPY:
复制本地主机的src路径下的内容到镜像中的dest路径下,但不会自动解压等
COPY的两种写法:
- COPY [–chown=<user>:<group>] <src>… <dest>
- COPY [–chown=<user>:<group>] [“<src>”,… “<dest>”]
--chown功能仅在用于构建Linux容器的Dockerfiles上受支持,而在Windows容器上不起作用。
COPY指令从 src 复制新文件或目录,并将它们添加到容器的文件系统中,路径为 dest 。
可以指定多个 src 资源,但是文件和目录的路径将被解释为相对于构建上下文的源。
每个 src 都可以包含通配符,并且匹配将使用Go的filepath.Match规则进行。
COPY hom* /dest/
COPY hom?.txt /dest/
COPY test.txt relativeDir/
COPY test.txt /absoluteDir/
COPY --chown=55:group1 files* /dest/
COPY --chown=bin files* /dest/
COPY --chown=1 files* /dest/
USER:
设置运行映像时要使用的用户名(或UID)以及可选的用户组(或GID),以及Dockerfile 中USER后面所有RUN,CMD和ENTRYPOINT指令。相当于给容器开一个用户权限,可以用这个权限去运行容器。
USER <user>[:<group>]
USER <UID>[:<GID>]
WORKDIR
为WORKDIR以下的指令,指定了基础目录。 若目录不存在,则创建。
可在Dockerfile中多次使用。 如果提供了相对路径,则它将相对于上一个WORKDIR指令的路径。
WORKDIR /w
RUN pwd
WORKDIR ww
RUN pwd
ENV path=/w
WORKDIR $path
RUN pwd
VOLUME:
创建数据卷挂载点,把容器的某些文件夹映射到主机外部,不存在则创建,一般用于挂载日志。
注意:对于声明后的卷内容的修改会被丢弃,所以一定在volume声明之前修改内容 ;
RUN mkdir /text
RUN echo aaa > /text/a.text
VOLUME ["/text"]
RUN echo bbb >> /text/a.text
EXPOSE:
只是声明镜像内服务监听的端口
通知Docker容器在运行时在指定的网络端口上进行侦听。 可以指定端口是侦听TCP还 是UDP,如果未指定协议,则默认值为TCP。
实际上不会发布端口。 它充当构建映像的人员和运行容器的人员之间的一种文档,即有关打算发布哪些端口的信息。 要在运行容器时实际发布端口,请在docker run上使用-p标志发布并映射一个或多个端口,或使用-P标志发布所有公开的端口并将其映射到高阶端口。
EXPOSE <port> [<port>/<protocol>...]
EXPOSE [80,443]
EXPOSE 80/tcp
EXPOSE 80/udp
HEALTHCHECK:
健康检查
多阶段构建
官方文档:https://docs.docker.com/develop/develop-images/multistage-build/
目的是如何让一个镜像变得更小。
选择最小的基础镜像
合并RUN环节的所有指令,少生成一些层
RUN期间可能安装其他程序会生成临时缓存,要自行删除。
使用 .dockerignore 文件,排除上下文中无需参与构建的资源
合理使用构建缓存加速构建。[–no-cache]
https://github.com/docker-library/
案例1:
1.先在项目下创建Dockerfile(保证Dockerfile和项目在同一个文件夹)
2.先上传Java项目到服务器
3.进入项目下,可查看
![在这里插入图片描述](https://img-blog.csdnimg.cn/7d099bc486d441218463a448660543e0.png)
4.修改Dockerfile文件,可以全部复制使用
FROM maven:3.8.6-eclipse-temurin-8-alpine AS builder
WORKDIR /app
COPY pom.xml .
COPY src .
RUN mvn clean package -Dmaven.test.skip=true
RUN cp /app/target/*.jar /app.jar
FROM openjdk:8u282-slim
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
LABEL maintainer="test"
COPY --from=builder /app/target/*.jar /app.jar
ENV JAVA_OPTS=""
ENV PARAMS=""
ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom $JAVA_OPTS -jar /app.jar $PARAMS" ]
5.配置dockerignore
touch .dockerignore
vi .dockerignore
.git
*.impl
target/*
6.构建镜像:docker build -t demo:java
7.启动:docker run -d -P demo:java
案例2:springboot-java 的Dockerfile写法
FROM openjdk:8u282-slim
LABEL maintainer="test"
COPY target/*.jar /app.jar
RUN apk add -U tzdata && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone && touch /app.jar;
ENV JAVA_OPTS=""
ENV PARAMS=""
EXPOSE 8080
ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom $JAVA_OPTS -jar /app.jar $PARAMS" ]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)