ThankNeko's Blog ThankNeko's Blog
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)

Hoshinozora

尽人事,听天命。
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)
  • 操作系统

  • 虚拟化服务

    • Docker笔记

      • Docker介绍与使用
      • Dockerfile编写
        • Dockerfile介绍
        • Dockerfile书写格式
          • 注释
          • FROM
          • MAINTAINER
          • RUN
          • COPY
          • ADD
          • CMD
          • ENV
          • ARG
          • VOLUME
          • WORKDIR
          • USER
          • EXPOSE
          • ONBUILD
          • 例子
    • Kubernetes笔记

    • Jenkins笔记

    • K3S笔记

  • 数据库服务

  • 监控服务

  • Web服务

  • 数据处理

  • Ops
  • 虚拟化服务
  • Docker笔记
Hoshinozora
2023-03-05
目录

Dockerfile编写

# Dockerfile介绍

Dockerfile类似于一种脚本,用来告诉docker build命令在构建镜像时,应该执行哪些操作。一般用一个目录存放Dockerfile和其他构建需要用到的文件,例如:/nginx/Dockerfile。编写好后,可以使用docker build命令进行镜像构建。

# Dockerfile书写格式

image-20230305181346518

# 注释

  • Dockerfile中注释以#开头即可。

# FROM

  • FROM [image]:[tag]或FROM [image]
  • 指定基础镜像信息,我们相当于是在FROM指定的镜像之上进行构建。

# MAINTAINER

  • MAINTAINER [维护者信息]
  • 例如:MAINTAINER Jasper Xu <sorex@163.com>

# RUN

指定构建时执行的命令,它是基于FROM镜像之上执行的。

  • RUN [命令行命令] - SHELL格式

    • 等同于在终端操作shell命令。
  • RUN ["可执行文件", "参数1", "参数2"] - EXEC格式

    • 两者种方式没有太大区别,例如:RUN ["./test.php", "dev", "offline"] 同等于 RUN ./test.php dev offline。
  • 注意:

    • Dockerfile的指令每执行一次都会在 docker上新建一层,所以过多无意义的层,会造成镜像膨胀过大。

    • 所以我们一般多条命令用"&&"符号连接命令,这样执行只会创建1层镜像。

    • 例如:

      RUN mkdir /test1
      RUN touch /test1/txt
      RUN touch /test1/test2
      以上执行会创建 3 层镜像,以下只会创建 1 层镜像:
      RUN mkdir /test1 \
      && touch /test1/txt \
      && touch /test1/test2
      
      1
      2
      3
      4
      5
      6
      7

# COPY

复制指令,会从本机中复制文件或者目录,到容器中指定路径。

  • COPY [参数] [源文件] [目标路径]
    • --chown=[用户]:[组] 复制时改变文件属主属组。
  • 注意:
    • 源文件可指定多个 [源文件1],[源文件2]...,且源文件可以使用通配符*?。
    • 目标路径不存在的话,会自动创建。

# ADD

与COPY差不多,只不过源文件压缩格式为gzip、bzip2、xz时,会自动解压到目标路径。同样需求下,官方推荐使用COPY,我们在不需要解压时使用COPY,需要解压时使用ADD即可。

  • ADD [参数] [源文件] [目标路径]

# CMD

指定容器默认启动命令。

  • CMD ["<可执行文件或命令>","<param1>","<param2>",...]
  • 注意:
    • CMD中的引号必须是双引号。
    • CMD指定的命令可被docker run时指定的启动命令覆盖。

# ENV

定义环境变量,并且在后续的命令中,可以使用这个环境变量,通过$调用例如$TEST,且构建好后仍然存在。

  • ENV [key1]=[value1] [key2]=[value2]...

# ARG

与ENV作用一致,不过ARG设置的环境变量仅在构建过程中有效,构建好后不会存在。

  • ARG [key1]=[value1] [key2]=[value2]...

# VOLUME

用于指定持久化目录,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,匿名卷被docker隐藏存放在本地的未知路径。

  • VOLUME ["容器目标目录","容器目标目录"...]

# WORKDIR

切换工作目录,类似于cd命令,设置工作目录后,Dockerfile中其后的命令都会在该目录下执行。

  • WORKDIR [工作目录路径]

# USER

指定运行容器时的用户名或UID或GID,后续容器运行时也会使用指定用户,用户和用户组必须提前已经存在。

  • USER [用户名/用户ID]
  • USER [用户名/用户ID:用户组名/用户组ID]
  • 注意:
    • 通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。

# EXPOSE

声明要暴露的端口,但并不映射,帮助镜像使用者理解这个镜像服务的端口,以方便配置映射。在容器运行命令如果指定-P参数,则会自动随机映射EXPOSE的端口。

  • EXPOSE <端口1> [<端口2>...]

# ONBUILD

用于延迟构建命令的执行,当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被触发。

  • ONBUILD [指令]...
  • 例如:ONBUILD RUN mkdir /test

# 例子

  • mkdir -p ./test/ && cd ./test && touch test.conf && vim Dockerfile
FROM ubuntu:latest
MAINTAINER Harmoniar <985816089@qq.com>

# 一个测试Dockerfile

ENV USERNAME=admin KEY=123456

COPY test.conf /data/config/

WORKDIR /data/

EXPOSE 80

RUN touch /data/test.txt && \
    mkdir /data/lib && \
    touch /data/lib/iamlib
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  • docker build -t testimg:latest --force-rm .
#Linux#Dockerfile#容器
Docker介绍与使用
Kubernetes介绍

← Docker介绍与使用 Kubernetes介绍→

最近更新
01
二〇二五年四月十七日随笔
04-17
02
二〇二五年四月十六日随笔
04-16
03
二〇二五年四月九日随笔
04-09
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Hoshinozora | MIT License
湘ICP备2022022820号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式