Dockerfile

2023-05-16


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"] 

#构建出如上镜像后测试:
	#docker run xxxx:什么都不传则echo Dockerfile 
	#docker run xxx arg1:传入arg1则echo arg1

3.构建镜像

docker build -t 镜像名:tag -f Dockerfile文件名 . #.表示当前上下文
docker build -t 镜像名:tag -f Dockerfile文件名 /指定目录 #/:根目录或者/xxx指定目录

#查看构建的镜像
docker images 镜像名

4.运行

docker run -it 镜像名:tag # 交互模式

docker run -d 镜像名:tag # 后台模式

docker run -d -p 83:80 镜像名:tag  # 后台模式,-p 83:80 映射到本地83端口

三、指令:

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  # 输出:Dockerfile
RUN ["echo","$param"]  # 输出:$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"]
# CMD 可以被修改
docker run -it 镜像名:tag ping github.com

# 官方推荐写法
CMD ["baidu.com"]
ENTRYPOINT ["ping"] # exec写法
# CMD给ENTRYPOINT提供参数

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  # 输出:Dockerfile
CMD echo $param  # 输出:Dockerfile

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  # 不以斜杠结尾,把当前内容复制到alpine的dest
ADD 路径/文件夹 /dest/ # 以斜杠结尾,把当前内容复制到alpine的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/ #当前上下文,以home开始的所有资源 
COPY hom?.txt /dest/ # ?匹配单个字符 
COPY test.txt relativeDir/ # 目标路径如果设置为相对路径,则相对与 WORKDIR 开始 # 把 “test.txt”添加到<WORKDIR>/relativeDir/ 
COPY test.txt /absoluteDir/ #也可以使用绝对路径,复制到容器指定位置 

#所有复制的新文件都是uid(0)/gid(0)的用户,可以使用--chown改变,添加用户权限和用户组
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 #结果 /w
WORKDIR ww
RUN pwd #结果 /w/ww

ENV path=/w
WORKDIR $path 
RUN pwd 
#结果 /w

VOLUME:

创建数据卷挂载点,把容器的某些文件夹映射到主机外部,不存在则创建,一般用于挂载日志。

注意:对于声明后的卷内容的修改会被丢弃,所以一定在volume声明之前修改内容 ;

RUN mkdir /text #创建text文件
RUN echo aaa > /text/a.text #写入aaa到a.text文件

VOLUME ["/text"] #可以是JSON数组 
#VOLUME /text #可以直接写 
#VOLUME /text/a /text/b #可以空格分割多个

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.进入项目下,可查看

在这里插入图片描述

4.修改Dockerfile文件,可以全部复制使用

# 环境构建,在https://hub.docker.com/_/maven/tags?page=1&name=alpine搜索,
# AS builder 取别名
FROM maven:3.8.6-eclipse-temurin-8-alpine AS builder 

# 第一种:指定工作目录
#WORKDIR /app 
#ADD ./ /app 

#第一种: 将pom.xml和src拷贝到/app文件下
WORKDIR /app 
COPY pom.xml .
COPY src .

# 打包
RUN mvn clean package -Dmaven.test.skip=true 

# 将target下的所有jar包,都变成app.jar
RUN cp /app/target/*.jar /app.jar 

# 安装运行环境
FROM openjdk:8u282-slim
# 修改时区,可以让镜像时间同步。
# RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone 
# 或 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone 
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone 
# 作者
LABEL maintainer="test" 

# --from=builder 来自于上一个阶段复制内容,都复制过来
# 
COPY --from=builder /app/target/*.jar /app.jar 

ENV JAVA_OPTS="" 
ENV PARAMS=""
# 运行jar包 
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:8-jre-alpine 
FROM openjdk:8u282-slim
LABEL maintainer="test" 
# 需要服务已经打好了包上传
# 将target下的所有jar包,都变成app.jar
COPY target/*.jar /app.jar 
# 修改时区,touch /app.jar; 记录最后保存记录的时间(ls -lah)
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" ]

# 运行命令 docker run -e JAVA_OPTS="-Xmx512m -" -e PARAMS="--spring.profiles=dev --server.port=8080" -jar /app/app.jar
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dockerfile 的相关文章

随机推荐

  • 【TPM2.0原理及应用指南】 1-3章

    码字不易 xff0c 求求点个赞呗 第一章 TPM的历史 可信平台模块 xff08 TPM xff09 是一种加密协处理器 可信计算组织 xff08 TCG xff09 直接匿名认证 DAA 认证可迁移密钥 xff08 Certified
  • QGC通过网络连接飞控(树莓派+ROS桥接MavLink)

    1 为树莓派刷ubuntu 因为无界面的ubuntu在连接无线 设置自动登录等方面的设置比较复杂 我经过各种百度尝试后 均没有成功 所以我放弃了 转而又刷了ubuntu mate 带界面 然后连接了无线 设置了自动登录 静态IP 自此树莓派
  • 大厂大数据岗位面试随笔

    大厂面试简要记录 1 腾讯2 阿里 1 腾讯 腾讯PCG事业部 大数据开发岗 问题回忆 xff1a spark数据分发机制Hadoop集群高可用机制阐述Spark Streaming给个具体视频应用场景阐述开发思路及任务架构 xff08 期
  • 南京邮电大学C++实验三(多态性实验)

    文章目录 一 实验目的和要求二 实验环境 实验设备 三 实验原理及内容 xff08 一 xff09 实验题目1 xff1a 1 题目2 代码3 程序运行结果 4 实验解答过程 xff1a 1 类Point的构造函数 xff1a 2 用成员函
  • ROS package.xml教程

    文章目录 总览标准格式2 xff08 推荐格式 xff09 基本结构必要标签依赖元包其他标签 标准格式1 xff08 遗留格式 xff09 总览 ROS的package包使用package xml文件来描述 xff0c 该描述文件必须放置在
  • 如何从论文中实现算法复现(译)

    原文地址 xff1a http xff1a codecapsule com 2012 01 18 how to implement a paper 作者 xff1a Emmanuel Goossaert 翻译 xff1a Joseph Ar
  • CMakeList.txt

    一个视频讲解 http v youku com v show id XMjc1MjE0MjEwNA 61 61 html cmake 语法设置路径 xff0c 配置库 xff0c 编译器标记 xff1a https www cnblogs
  • GPS ROS包

    NMEA GPS数据读取 span class hljs label http span wiki span class hljs preprocessor ros span span class hljs preprocessor org
  • Arduino Atmega328P烧写bootloader及熔丝

    Arduino Atmega328P烧写bootloader及熔丝 Cc1924的博客 CSDN博客 亲测成功
  • 云服务器 搭建 AWTRIX 服务器

    Java 环境 首先检查 java 版本 如果没有 安装 openjdk 后再执行 sh脚本 yum list java 1 8 yum install java 1 8 0 openjdk y wget N https blueforce
  • esp8266对接天猫精灵(1)前言

    本系列文章小狂决定一步步来完成其他智能设备与天猫精灵的对接 xff0c 简单粗暴的目的就是使用ESP8266或者其他的wifi设备制造一个智能设备 xff0c 完成一次天猫精灵智能音箱对我们自己制造的智能设备的控制 xff0c 以来验证天猫
  • 牢记公式,ardupilot EKF2就是纸老虎(二)!

    版权声明 xff1a 本文为博主原创文章 xff0c 转载请附上博文链接 xff01 二 扩展卡尔曼滤波器 因为卡尔曼滤波器针对的是线性系统 xff0c 状态转移模型 xff08 说的白话一点就是知道上一时刻被估计量的值 xff0c 通过状
  • esp8266对接天猫精灵(3)原理

    这一篇文章主要讲解服务器端的设置 xff0c 这里我使用的是腾讯云 xff0c 当时学生价1块钱一个月买的 xff0c 现在的学生价涨到了10块 xff0c 为我当时的机智点赞 为什么一定要使用服务器呢 xff0c 这个是因为天猫精灵协议的
  • esp8266对接天猫精灵(8)开发者网关地址

    洋洋洒洒六七千字已经搭进去了 xff0c 终于把服务器篇写的差不多了 xff0c 当然小狂不是专业的写手 xff0c 有些东西写的凑合看吧 xff0c 只是说明过程 xff0c 并不修饰言辞 xff0c 看的舒服就点个赞 xff0c 不舒服
  • esp8266对接天猫精灵(10)nodumcu固件编译

    一 下载编译器 进入这个网站 xff0c https esp8266 ru esplorer xff0c 找到这个地方 xff0c 可以直接下载 xff0c 下载完成后双击红框中的内容就能打开 打开后的截图如下图所示 xff0c 左边为代码
  • esp8266对接天猫精灵(11)终端编程

    一 编写lua脚本获取控制信息 xff08 8266 xff09 前边也说过 xff0c 这个脚本要实现的步骤可以分三步 xff0c 第一步是联网 xff0c 第二步是使用http get到数据 xff0c 然后控制要控制的设备 我们的lu
  • Altium Designer -- 精心总结

    如需转载请注明出处 xff1a http blog csdn net qq 29350001 article details 52199356 以前是使用DXP2004来画图的 xff0c 后来转行 想来已经有一年半的时间没有画过了 突然转
  • Arduino点亮ws2812

    先加载ws2812库文件 span style color rgb 68 68 68 font family none font size 14px background color rgb 255 255 255 a target bla
  • Arduino 旋转编码器ky-040

    int pinA 61 3 Connected to CLK on KY 040 CLK接 pin3 int pinB 61 4 Connected to DT on KY 040 DT接pin4 SW是按键 xff0c 不用接 int e
  • Dockerfile

    Dockerfile文件 xff0c 自创镜像 一 概念 xff1a 二 案例 xff1a 1 先创建一个Dockerfile文件2 编写内容3 构建镜像4 运行 三 指令 xff1a FROM xff1a MAINTAINER xff1a