Dockerfile 语法
Dockerfile语法由两部分构成,注释和命令+参数
1、FROM [:] [AS ]: 设置基础镜像;
FROM命令可能是最重要的Dockerfile命令。改命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜 像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
#注:tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
例如:
FROM alpine:latest
2、MAINTAINER: 维护者信息;
格式: MAINTAINER <authtor`s detail> 一般约定俗成地使用坐着名称及邮件地址。
例如:MAINTAINER david "linzhi.luo@avazu.net"
3、ENV 设置环境变量
格式:
ENV <key> <value>
ENV <key>=<value> ...
注意:ENV \ =: 设置容器环境变量。可以使用docker run --env =修改环境变量
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat fluffy
4、WORKDIR: 工作目录,类似于cd
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
注:
通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、
ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用
docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
5、RUN 命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。
格式:
RUN ["executable", "param1", "param2"]:
注意:executable 是命令,后面的 param是参数
执行shell脚本。进来少使用RUN,因为没执行一次 docker就会增加一层只读层。
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
等同于
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
等同于
RUN ["/bin/bash", "-c", "source $HOME/.bashrc; echo $HOME"]
注意:
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
6、CMD 可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后启动时才被调用。
格式:
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
注意:DockerFile中只有一个CMD,多于一个将执行最后一个。它的意思差不多就是启动容器后执行的默认命令。
示例:
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
7、LABEL 为镜像添加元数据
格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
LABEL = = ... : 镜像标签
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
8、EXPOSE 用来指定端口,使容器内的应用可以通过端口和外界交互。
格式:
EXPOSE <port> [<port>...]
注意:
EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或 通过-P 参数来发布EXPOSE导出的所有端口
EXPOSE [/...]: 暴露容器的端口
EXPOSE 80/tcp
EXPOSE 80/udp
9、 ADD: 将本地文件添加到容器中,tar类型文件会自动解压,可以访问网络资源
ADD [--chown=:] ... \ [--chown=:] ["",... ""]: 拷贝一个新文件,或者文件夹或者远程文件的 URLS,把他们添加到,镜像的文件系统中。 为绝对路径或者由WORKDIR定义的相对路径。
ADD hom* /mydir/ # 添加所有以 "hom" 开头的文件
ADD hom?.txt /mydir/ # ? 替换任何单个的字符, e.g., "home.txt"
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
ENV cpath /home/zb
ARG zbpath=/home/lala
WORKDIR $cpath
ADD **.jpg $cpath
ADD **.jpg $zbpath
# 添加含有特殊字符的文件或者文件夹时如“[]”,需要遵循 golang 的规则将它们进行转义,以防它们为匹配模式
ADD arr[[]0].txt /mydir/ # 复制一个文件名为 "arr[0].txt" 到 /mydir/
# 通过 --chown 指定添加文件或者文件夹的用户名和组名
ADD --chown=55:mygroup files* /somedir/
ADD --chown=bin files* /somedir/
ADD --chown=1 files* /somedir/
ADD --chown=10:11 files* /somedir/
10、COPY 功能类似于ADD,但是不会自动解压文件,也不能访问网络资源。
格式:
copy <src> ... <dest> 或者
COPY [--chown=:] ... / [--chown=:] ["<src>",... "dest"]
<src>:要复制的源文件或目录,支持使用通配符
<dest>:目标路径,即正在创建的 image的文件系统路径;建议为<dest>使用绝对路径,否则,copy指定则以workdir为其起始路径;
注意:在路径中有恐怖字符时,通常使用第二种格式。
文件复制准则
A、<src>必须是build上下文中的路径,不能是其父目录中的文件;
B、如果<src> 是目录,则内部文件或者子目录会被递归复制,但<src>目录自身不会被复制;
C、如果指定了多个<src>,或在<src>中使用了通配符,则<dest>必须是一个目录,且必须以 / 结尾;
D、如果<dest>事先不存在,它将会自动被创建,这包括其父目录路径;
注意:需要复制的目录一定要放在Dockerfile文件的同级目录下;
原因:因为构建环境将会上传到Docker守护进程,而复制是在Docker守护进程中进行的。任何位于构建环境之外的东西都是不可用的。COPY指令的目的的位置则必须是容器内部的一个绝对路径。
11、ENTRYPOINT: 配置容器,使其可执行化。配合CMD可以省略“application”,只适用参数
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
ENTRYPOINT command param1 param2 (shell内部命令)
示例:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
注:
ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
ENTRYPOINT与CMD的比较
1.当有多个ENTRYPOINT CMD它们都只执行最后一个
2.当容器为一个可执行文件时应该定义ENTRYPOINT
3.当同时定义ENTRYPOINT 和 CMD时,CMD为ENTRYPOINT的默认参数
4.当docker执行run命令时,在里面指定CMD时,CMD将会被重写。
注意:entrpoint里全部必须是双引号,而不能是单引号
12、VOLUME: 指定持久化目录
格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/data"]
VOLUME ["/var/www", "/etc/log"]
注:
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1 卷可以容器间共享和重用
2 容器并不一定要和其它容器共享卷
3 修改卷后会立即生效
4 对卷的修改不会对镜像产生影响
5 卷会一直存在,直到没有任何容器在使用它
RUN mkdir /data1
RUN touch /data1/2a.txt
VOLUME /data1
# 通过命令 docker inspect hasVvolume
"Mounts": [
{
"Type": "volume",
"Name": "0d63fcdf621ee728bb85dfcc2b30f3acddf6489a0e93b81ced17f05860497321",
"Source": "/var/lib/docker/volumes/0d63fcdf621ee728bb85dfcc2b30f3acddf6489a0e93b81ced17f05860497321/_data",
"Destination": "/data1",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
===============================================================
# 也可以通过 docker run -v 来挂载共享目录,这时 Source 指出 -v 时定义的目录
"Mounts": [
{
"Type": "bind",
"Source": "/Users/zhangbo/Desktop/data1",
"Destination": "/data1",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
容器中共享目录
# 使用 --volumes-from,达到容器中文件夹共享
docker run -itd --name noVvolume-v-1 --volumes-from noVvolume-v 48cd9e43b6a9
13、USER: 设置启动容器的用户名或UID,默认是root用户。后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,docker run时,可以通过-u参数覆盖指定的用户
示例
USER daemon
14、ARG: 指定传递给构建运行时的变量
ARG [=] : docker file中的变量
FROM busybox
ARG user1="zhang bo"
ARG buildno
RUN echo $user1
RUN echo $buildno
输出信息:
Step */* : RUN echo $user1
---> Running in a56a602a8f87
zhang bo
Removing intermediate container a56a602a8f87
---> 3e9c6ec19129
Step */* : RUN echo $buildno
---> Running in 6598768a1080
预制变量
FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0}
RUN echo $CONT_IMG_VER
# 可以通过 --build-arg 标签进行给定的预制的变量。--build-arg <varname>=<value>
docker run --build-arg CONT_IMG_VER=******* .
15、ONBUILD: 设置镜像触发器
docker 常用命令如下
管理命令:
container 管理容器
image 管理镜像
network 管理网络
node 管理Swarm节点
plugin 管理插件
secret 管理Docker secrets
service 管理服务
stack 管理Docker stacks
swarm 管理Swarm集群
system 查看系统信息
volume 管理卷
如:docker container ls 显示所有容器
普通命令:
attach 进入一个运行的容器
build 从一个DockerFile构建镜像
commit 从容器创建一个镜像
cp 从容器和主机文件系统之间拷贝文件
create 创建一个容器
diff 检查容器文件系统上的更改
events 从服务器获取实时事件
exec 在正在运行的容器中运行命令
export 将容器的文件系统导出为tar存档
history 显示镜像的历史记录
images 查看镜像列表
import 从归档文件中创建镜像
info 显示系统范围的信息
inspect 返回Docker对象的低级信息
kill kill运行中的容器
load 从存档或者STDIN加载镜像
login 登陆docker镜像仓库
logout 退出docker镜像仓库
logs 获取一个容器的日志
pause 暂停一个或多个容器中的所有进程
port 查看端口映射或容器的特定映射列表
ps 查看容器列表
pull 从镜像仓库拉取镜像
push 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
rename 重命名容器
restart 重启容器
rm 删除容器
rmi 删除镜像
run 创建一个新的容器并运行一个命令
save 将指定镜像保存成 tar 归档文件
search 从Docker Hub搜索镜像
start 启动容器
stats 实时显示容器资源使用情况的统计信息
stop 停止容器
tag 标记本地镜像,将其归入某一仓库
top 展示一个容器中运行的进程
unpause 恢复容器中所有的进程
update 更新容器配置
version 显示Docker的版本信息
wait 阻塞直到容器停止,然后打印退出代码
如:docker images 显示所有镜像