关于Dockfile的写法

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>",...]

组合使用 CMDENTRYPOINT

----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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值