Dockerfile指令
基础指令
1.FROM
FROM
#格式:
FROM <image>
FROM <image>:<tag>
#解释:
#FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令
#可以有多个FROM语句,来创建多个image
#FROM 后面是有效的镜像名称,如果该镜像没有在你的本地仓库,那么就会从远程仓库Pull取,如果远程也没有,就报错失败
#下面所有的 系统可执行指令 在 FROM 的镜像中执行。
2.MAINTAINER
作者信息
MAINTAINER
#格式:
MAINTAINER <name>
#解释:
#指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息
3.RUN
RUN
#格式:
RUN <command> (shell模式)
RUN["executable", "param1", "param2"] (exec 模式)
#解释:
#表示当前镜像构建时候运行的命令,如果有确认输入的话,一定要在命令中添加 -y
#如果命令较长,那么可以在命令结尾使用 \ 来换行
#生产中,推荐使用上面数组的格式
#注释:
#shell模式:类似于 /bin/bash -c command
#举例: RUN echo hello
#exec模式:类似于 RUN["/bin/bash", "-c", "command"]
#举例: RUN["echo", "hello"]
推荐使用exec模式
4.EXPOSE
EXPOSE
#格式:
EXPOSE <port> [<port>...]
#解释:
设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口,如果需要外部提供访问,
还需要启动容器时增加-p或者-P参数对容器的端口进行分配。
# docker run -itd -p 8888:80
EXPOSE 80
运行时指令
1.CMD
#格式:
CMD ["executable","param1","param2"] (exec 模式)推荐
CMD command param1 param2 (shell模式)
CMD ["param1","param2"] 提供给ENTRYPOINT的默认参数;
-
CMD指定容器启动时默认执行的命令
-
每个Dockerfile只能有一条CMD命令,如果指定了多条,只有最后一条会被执行
-
如果你在启动容器的时候使用docker run 指定的运行命令,那么会覆盖CMD命令。
例如:
CMD ["/usr/sbin/nginx","-g","daemon off;"]
“/usr/sbin/nginx” nginx命令
“-g” 设置配置文件外的全局指令
“daemon off;” 后台守护程序开启方式 关闭
2.ENTRYPOINT
#格式:
ENTRYPOINT ["executable", "param1","param2"] (exec 模式)
ENTRYPOINT command param1 param2 (shell 模式)
-
和CMD 类似都是配置容器启动后执行的命令,并且不会被docker run 提供的参数覆盖
-
每个Dockerfile 中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效
-
想要在docker run 时被覆盖,可以使用"docker run --entrypoint"
3.CMD和ENTRYPOINT命令组合使用
任何docker run设置的命令参数或者CMD指令的命令,都将作为ENTRYPOINT 指令的命令参数,追加到ENTRYPOINT指令之后
ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-g"]
文件编辑指令
1.ADD
将宿主机文件拷贝到容器目录中,如果宿主机文件是可识别的压缩包, 会进行解压缩
ADD 宿主机文件 容器目录/文件
-
宿主机文件一般放到Dockerfile对应的目录中
-
容器目录,若存在,直接拷贝到容器目录;若不存在,先在容器中创建一个, 再拷贝
ADD ["a.txt", "/home/go/a.txt"]
- 第二个参数如果指定的是一个文件名,这个文件存在, 直接覆盖;不存在,直接拷贝
可用于替换软件源文件
# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER panda kstwoak47@163.com
# 执行命令
ADD ["sources.list","/etc/apt/sources.list"]
RUN apt-get clean
RUN apt-get update
RUN apt-get install nginx -y
# 对外端口
EXPOSE 80
2.COPY
COPY 指令和ADD 指令功能和使用方式类似。只是COPY 指令不会做自动解压工作,单纯复制文件场景,Docker 推荐使用COPY
COPY ["<src>",... "<dest>"]
3.VOLUME
VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点
如:
Dockerfile文件中
...
VOLUME ["/var/lib/tomcat7/webapps/"]
...
#VOLUME实践
#修改Dockerfile文件内容:
#将COPY替换成为VOLUME
:~/docker/images/nginx$vim Dockerfile
VOLUME ["/helloworld/"]
...
#构建镜像
:~/docker/images/nginx$docker build -t ubuntu-nginx:v0.9 .
#创建数据卷容器
:~/docker/images/nginx$docker run -itd --name nginx-11 ubuntu-nginx:v0.9
#查看镜像信息
:~/docker/images/nginx$docker inspect nginx-11
#验证操作
:~/docker/images/nginx$docker run -itd --name vc-nginx-1 --volumes-from nginx-11 nginx
:~/docker/images/nginx$docker run -itd --name vc-nginx-2 --volumes-from nginx-11 nginx
#进入容器1
:~/docker/images/nginx$docker exec -it vc-nginx-1 /bin/bash
:/# echo 'nihao itcast' > helloworld/nihao.txt
#进入容器2
:~/docker/images/nginx$docker exec -it vc-nginx-2 /bin/bash
:/# cat helloworld/nihao.txt
环境指令
1.ENV
#ENV
#格式:
ENV <key> <value> (一次设置一个环节变量)
ENV <key>=<value> ... (一次设置一个或多个环节变量)
ENV HELLO 12345
ENV HELLO=12345
ENV HELLO=12345 WORLD=12345 NIHAO=12345
可以在命令行创建ENV的容器,如:
docker run -e NIHAO="helloworld" -itd --name ubuntu-111 ubuntu /bin/bash
#进入容器ubuntu-111
:~$ docker exec -it ubuntu-111 /bin/bash
:/# echo $NIHAO
或者修改Dockerfile文件内容
#在上一个Dockerfile 文件内容基础上,在RUN 下面增加一个ENV
ENV NIHAO=helloworld
...
#构建镜像
docker build -t ubuntu-nginx:v0.10 .
#根据镜像创建容器,创建时候,不添加执行命令
docker run --name nginx-12 -itd ubuntu-nginx:v0.10
docker exec -it nginx-12 /bin/bash
echo $NIHAO
2.WORKDIR
切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。相当于cd
WORKDIR /a /a
WORKDIR b /a/b
WORKDIR /c /c
WORKDIR d /c/d
WORKDIR /nihao/itcast/
RUN ["touch","itcast1.txt"]
WORKDIR /nihao
RUN ["touch","itcast2.txt"]
WORKDIR itcast
RUN ["touch","itcast3.txt"]
触发器指令
制作了一个触发器镜像a。b是基于a制作的新镜像,b镜像的容器会执行触发器内容。
如:
# 原始镜像 -> 纯净版
-> 修改 ONBUILD ["echo", "hello,linux"]
# 基于原始镜像制作新镜像 -> 镜像A
-> 启动镜像A -> 不会输出hello, linux
# 基于镜像A制作了镜像B
-> 启动镜像B -> 会输出 hello, linux
Dockerfile构建无缓存指令
上一次构建时发生错误,本次构建需要取消缓存
docker build --no-cache -t [镜像名]:[镜像版本][Dockerfile位置]