目录
什么是dockerfile
dockerfile 构建镜像是以基础镜像为基础。Dockerfile是一个文本文件,内容就是用户编写的docker指令,每一条指令构建一层,每一条指令内容就是描述每一层如何构建。
dockerfile的基本结构
Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义镜像。
Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
Docker分为四部分:
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时默认要执行的指令
dockerfile的指令
指令的一般格式为INSTRUCTION arguments
,指令包括:
- FROM
- LABEL MAINTAINER
- RUN
- CMD
- EXPOSE
- ENV
- ADD
- COPY
- ENTRYPOINT
- VOLUME
- USER
- WORKDIR
- ONBUILD
FROM第一条指令必须为FROM指令。格式为FROM <image>
或FROM <image>:<tag>
[root@node1 opt]# cat Dockerfile
FROM busybox
LABEL MAINTAINER指定维护者信息 格式为LABEL MAINTAINER <name email_address>
LABEL MAINTAINER jiran [email protected]
RUN每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像
格式为RUN <command>
或RUN ["executable","param1","param2"]
FROM busybox
RUN echo "ly" > /opt/
CMD用于指定启动容器时默认要执行的命令,每个Dockerfile只能有一条CMD命令。
CMD支持三种格式:
CMD ["executable","param1","param2"]
使用exec执行,推荐方式CMD command param1 param2
在/bin/sh中执行,提供给需要交互的应用CMD ["param1","param2"]
提供给ENTRYPOINT的默认参数
FROM busybox
CMD ["apachectl","-D","FOREGROUND"]
EXPOSE用于告诉Docker服务器容器暴露的端口号,供互联系统使用。
格式为EXPOSE <port> [<port>...]
。
FROM busybox
EXPOSE 80
CMD ["httpd","-f","-h","tmp"]
[root@node1 opt]# podman build -t ly:1.1 .
[root@node1 opt]# podman run -d -P ly:1.1
20b11784b4eb1518dfc3660fd185906a0bc3d746a78863513a3ff5371bdc2731
[root@node1 opt]# podman port -l
80/tcp -> 0.0.0.0:45463
ENV指定一个环境变量,会被后续RUN指令使用,并在容器运行时保持 格式为ENV <key> <value>
FROM busybox
ENV version 1
RUN echo ${version} > /opt
EXPOSE 80
CMD ["httpd","-f","-h","tmp"]
[root@node1 opt]# podman build -t ly:1.3 .
[root@node1 opt]# podman run -it ly:1.3 /bin/sh
/ # cat /opt
1
ADD该命令将复制指定的
格式为ADD <src> <dest>
FROM busybox
ADD abc /tmp
Successfully tagged localhost/ly/v1.4:latest
24d8eca8d01c10543af4f5edac64760a7e1e4f4a2cc8ef9f7fab81833fc5c415
[root@node1 opt]# podman run -it ly/v1.4 /bin/sh
/ # ls /tmp/
abc
COPY复制本地主机的
格式为COPY <src> <dest>
FROM busybox
COPY abc /tmp/abc
[root@node1 opt]# podman build -t ly/v1.5 .
[root@node1 opt]# podman run -it ly/v1.5 /bin/sh
/ # ls /tmp/abc
/tmp/abc
ENTRYPOINT配置容器启动后执行的命令,并且不可被docker run提供的参数覆盖。而且,如果在docker run的后面提供了参数,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序。
ENTRYPOINT有两种格式:
- ENTRYPOINT ["executable","param1","param2"]
- ENTRYPOINT command param1 param2(在shell中执行)
FROM busybox
ENTRYPOINT ["apachectl","-D","FOREGROUND"]
WORKDIR为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。
可以使用多个WORKDIR指令,后续命令如果参数是相对路径 格式为WORKDIR /path/to/workdir
。
FROM busybox
WORKDIR /tmp
[root@node1 opt]# podman build -t ly/v1.7 .
[root@node1 opt]# podman run -it ly/v1.7 /bin/sh
/tmp #
创建镜像
编写完成Dockerfile后,可以通过docker build命令来创建镜像。
基本的格式为docker build [选项] 路径
,该命令将读取指定路径下(包括子目录)的Dockerfile,并将该路径下所有内容发送给Docker服务端,由服务端来创建镜像。因此一般建议放置Dockerfile的目录为空目录。
另外,可以通过 .dockerignore
文件(每一行添加一条匹配模式)来让Docker忽略路径下的目录和文件。
要指定镜像的标签信息,可以通过-t选项。
[root@node1 opt]# podman build -t ly/v1.7 .
标签:opt,Dockerfile,root,CMD,node1,dockerfile,ly
From: https://www.cnblogs.com/TQingS/p/16641026.html