LOVEJOAN

文章 分类 评论
76 9 1453

站点介绍

人生是一场孤独的旅行,没有终点。。。

Dockerfile编写

chuck 2023-03-14 329 9条评论 Docker Docker

首页 / 正文

Dockerfile学习

通过dockerfile文件可以自定义构建镜像,可以实现个性化需求,相对于docker commit和导入导出能够实现更加灵活的功能实现。

FROM指令

指定基础镜像,必备命令且为第一条命令。如常见应用镜像nginxmysqlapachewordpress等,也可以使用基础的系统镜像centosubuntudebian等,以及特殊镜像scratch表示空白镜像。

# 
FROM nginx

FROM mysql

FROM centos

MAINTAINER指令

该指令用于指定作者或维护人员信息,新版可以使用LABEL指明。使用docker inspect查看位于顶层 "Author": ""中。

# 格式 MAINTAINER <name>
MAINTAINER chuck

LABEL 指令

新版用于设置标签元数据信息,以键值对形式存在。

# 格式,可以写多个,可以以\分隔
LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL version="1.0" description="test image"

RUN指令

RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。
其格式有两种:

  • shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockrfile 中的 RUN 指令就是这种格式。

    RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
  • exec 格式:RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式。

    RUN apt-get update

    需要注意的是在dockerfile中每一条命令都会在镜像上增加一层,镜像限制最大127层,层数越大体积越大越臃肿,因此我们可以使用&&连接,使用 \换行。

ADD指令

可以用于将本地文件复制到容器中,原路径可以是目录、url,ADD指令还可以用于压缩文件解压到容器中.

# 用法:ADD <src> <dest>
ADD /www/test.txt /usr/local/test.txt
ADD http://example.cn/config.property /

但是在实际应用中建议复制文件使用COPY指令,需要解压文件才使用ADD指令

WORKDIR指令

使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。容器内默认工作目录应该是/根目录。

VOLUME指令

用于指定匿名卷。匿名卷作用,在Dockerfile使用VOLUME指令指定的目录会自动映射一个到宿主机的docker安装目录下的一个目录,在容器被删除后不会被删除,用于防止像mysql等需要数据持久化的容器在docker run时没有指定挂载卷的情况。
如果-v和VOLUME指令同时应用,以-v配置为准,本身就是为了保护数据安全性的。

VOLUME /var/log/

EXPOSE指令

声明容器使用的端口。

格式为 EXPOSE <端口1> [<端口2>...]

EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。可以帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。-p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。

CMD指令

指定该容器启动的时候要运行的命令,只有最后一个会生效,可被替代。和RUN指令一样有两种形式。

  • shell 格式:CMD <命令>
  • exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
    参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。

用于设置容器的主程序,并且要声明用前台运行,例如下面的nginx:

CMD ["nginx", "-g", "daemon off;"]

ENTRYPOINT指令

指定该容器启动的时候要运行的命令,可以追加,可以作为容器运行前的检查以及执行CMD指令的内容。

<ENTRYPOINT> "<CMD>"

ONBUILD指令

当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令,触发指令。ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。

COPY指令

复制文件,将主机文件或文件夹复制到容器内部,需要注意文件上下文位置。
格式:

  • COPY <源路径>... <目标路径>
  • COPY ["<源路径1>",... "<目标路径>"]

ENV指令

设置环境变量,可以用于后面的RUN、CMD等指令执行。

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
# 示例
ENV PG_MAJOR=9.3
ENV PG_VERSION=9.3.4
ENV PATH=/usr/local/postgres-$PG_MAJOR/bin:$PATH

测试:基于centos构建安装net-tools

创建文件夹
mkdir myimage
进入文件夹
cd myimage
创建Dockerfile文件
touch Dockerfile
编辑文件,内容如下:
vim Dockerfile

# this is my test dockerfile
# 设置基础镜像
FROM centos

# 设置作者信息 
MAINTAINER chuck
VOLUME /var/log/
# yum源问题更新阿里云
RUN rm -rf /etc/yum.repos.d/* 
COPY CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo
RUN dnf install  -y net-tools \
&& dnf clean all

由于使用yum源问题,需要清空官方的repo,然后下载新的yum源,wegt无法使用,这里采用了从宿主机复制到容器的方法,不能直接写源路径,建议将文件复制到文件上下文目录。

执行构建命令
docker build -t centos8:v1 .
查看j镜像
docker images
查看历史构建过程
docker history centos8:v1
查看镜像的详细信息
docker inspect centos8:v1

评论(9)

  1. 1 游客 2025-03-28 00:31 回复

    555

  2. 1 游客 2025-03-28 00:31 回复

    555

  3. 1 游客 2025-03-28 00:30 回复

    555

  4. 1 游客 2025-03-28 00:29 回复

    555

  5. 1 游客 2025-03-28 00:28 回复

    555

  6. 1 游客 2025-03-28 00:28 回复

    555

  7. www.lovejoan.com 游客 2025-03-28 00:28 回复

    555

  8. 1 游客 2025-03-28 00:27 回复

    555

  9. 1 游客 2025-03-28 00:24 回复

    555

热门文章

最新评论

  • 1

    555fulIdEqZ' OR 160=(SELECT 160 FROM PG_SLEEP(15))--

  • 1

    555-1)) OR 58=(SELECT 58 FROM PG_SLEEP(15))--

  • 1

    555-1) OR 13=(SELECT 13 FROM PG_SLEEP(15))--

  • 1

    555-1 OR 475=(SELECT 475 FROM PG_SLEEP(15))--

  • 1

    555

  • 1

    555

  • 1

    5554FobGRsu') OR 696=(SELECT 696 FROM PG_SLEEP(15))--

  • 1

    555C9F0upP1' OR 504=(SELECT 504 FROM PG_SLEEP(15))--

  • 1

    555

  • 1-1; waitfor delay '0:0:15' --

    555

日历

2025年05月

    123
45678910
11121314151617
18192021222324
25262728293031

文章目录