Dockerfile 介绍
Dockerfile是用来自定义构建镜像的文件,格式:
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
docker 在每一行上新建一层,为了避免过多的层,用 &&
把一些命令缩成一行
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
[root@localhost dockerdir]# docker build -t imagetest:test .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
---> 8cf1bfb43ff5
Step 2/2 : RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html
---> Using cache
---> 2611d7938c46
Successfully built 2611d7938c46
Successfully tagged imagetest:test
[root@localhost dockerdir]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
imagetest test 2611d7938c46 2 hours ago 132MB
twilight/nginx ali 378d7ca4a813 3 hours ago 229MB
mysystem tags 1c174e9fbdee 3 hours ago 64.2MB
ubuntu 18.04 2eb2d388e1a2 6 days ago 64.2MB
nginx latest 8cf1bfb43ff5 9 days ago 132MB
training/webapp latest 6fae60ef3446 5 years ago 349MB
[root@localhost dockerdir]#
docker build
会将上下文路径中的所有文件打包发送给引擎,所以上下文路径不能放无用的文件,会造成执行过程的缓慢。
常见指令
ENV
定义的环境变量可以在build和run的时候以 $var
的形式引用,并持久化在容器中
----dockerfile-----
FROM centos:7
ENV KEY1=VALUE1 KEY2=VALUE2
ENV KEY3=VALUE3
CMD echo $KEY1
-------------------
docker run -itd image:tag # 输出value1
docker run -itd image:tag env # 输出所有环境变量
如果需要为单一的命令设置环境变量,可以在run命令中指定,或者使用 ARG 命令让环境变量只在dockerfile中生效
RUN DEBIAN_FRONTEND=noninteractive apt-get update
CMD
用于在容器构建完成后执行的命令。而RUN
是在build期间执行的命令
# 不推荐的写法
CMD <shell 命令>
# 推荐的写法
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
# 用于给entrypoint提供参数
CMD [<param1>","<param2>",...]
注意:
CMD
指定的命令可以被docker run
后的命令替换。- 当有多条
CMD
命令时,只有最后一条被执行。
例如对于:
----dockerfile-----
# 镜像名要小写
FROM centos:7
CMD ["ping", "-c", "3", "localhost"]
-------------------
docker run -itd image:tag # 默认执行ping命令
docker run -itd image:tag /bin/bash # 执行bash命令,替换默认的CMD
ENTRYPOINT
用于指定容器构建完成后执行的命令。
- 和
RUN
命令相似,但是ENTRYPOINT
不可以被替换(除非手动指定--entrypoint
)。 - 当有多条
ENTRYPOINT
命令时,只有最后一条会执行。
# 不推荐的写法
ENTRYPOINT <shell 命令>
# 推荐的写法
ENTRYPOINT ["<可执行文件或命令>","<param1>","<param2>",...]
组合使用 CMD
和ENTRYPOINT
:
----dockerfile-----
FROM centos:7
ENTRYPOINT ["ping", "-c", "3"] # 不会被 docker run 命令替代的部分
CMD ["localhost"] # 可以被 docker run 命令替代的部分
-------------------
docker run -itd image:tag # 默认执行 ping -c 3 localhost
docker run -itd image:tag www.baidu.com # 默认执行 ping -c 3 www.baidu.com
手动替换 ENTRYPOINT
。注意 --entrypoint bash
要写在镜像名称之前,否则会被当成 CMD
执行
----dockerfile-----
FROM centos:7
ENTRYPOINT ["ping", "-c", "3"] # 不会被 docker run 命令替代的部分
CMD ["localhost"] # 可以被 docker run 命令替代的部分
-------------------
docker run -itd --entrypoint bash image:tag # 替换默认的entrypoint,默认的cmd被忽略,会执行 bash
docker run -itd --entrypoint bash image:tag --version # 替换默认的entrypoint和cmd,会执行 bash --version
其他指令
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
: 目的路径不存在会自动创建。路径支持通配符。ADD
用法与COPY
一致,不同之处在于源文件为gzip, bzip2, xz
格式,会自动解压并复制到目标路径下。- 如果目标路径指定的是一个文件,则会覆盖这个文件(即使这个文件已经有内容),不存在就创建新文件
- 如果目标路径是一个目录,但是这个目录不存在,docker会自动创建目录
ENV <key> <value>
或者ENV <key1>=<value1> <key2>=<value2>
: 定义的环境变量可以在build和run的时候以$var
的形式引用ARG
和 ENV作用一样,但是仅限于在Dockerfile内生效,可以在docker build --build-arg key=value
来覆盖VOLUME ["<路径1>", "<路径2>"...]
自动挂载匿名数据卷EXPOSE <端口1> [<端口2>...]
声明端口,方便-P
配置WORKDIR <工作目录路径>
目录必须已经存在,在构建镜像的每一层中,该目录都会存在。USER <用户名>[:<用户组>]
切换用户
参考资料
https://www.runoob.com/docker/docker-dockerfile.html
https://blog.csdn.net/shunfa888/article/details/79373840