Dockerfile文件命令解释

原文: https://blog.csdn.net/xyz_dream/article/details/86717241

几分钟就能掌握Dockerfile文件命令的含义:

1.ARG version=1.0 # 传递过来的变量参数  默认值是1.0  在使用docker build --build-arg version=1.0(默认参数)  使用 ${ARG变量名} 来当做变量:

例如 :
ARG version=1.12
FROM nginx:${version} # 如果ARG的version没有通过 docker build --build-arg key=val传过来的话使用默认值  1.12  ,如果传递则覆盖。


2.FROM ubuntu:16.04 # 基础镜像,你要在哪个镜像的基础上构建


3.LABLE com.java.version=1.7 \  # 自定义lable
        com.java.jdk=1.8
        maintainer="author author@xx.com" # MAINTAINER已经废弃  主要是写一些关于Dockerfile维护者的想你想


# shell形式   此形式默认真实执行的命令是:  /bin/sh -c "echo 'hello world' >> /root/data.txt"

4.RUN echo "hello world" >> /root/data.txt  # 提交一层镜像    apt-get update  删除rm -rf /var/lib/apt/lists/*  减小镜像大小


# exec 形式
5.RUN ["/bin/sh","-c","echo world"]   # 默认shell是  /bin/sh  -c 


6.CMD ["可执行文件","参数1","参数2"]  # 默认默认启动的命令。 可以有多个,但是最后一个会覆盖前面所有的CMD的。最后一个为准
    ["作为entrypoint的默认参数1","作为entrypoint的默认参数2"] # 有entrypoint的情况下
    命令 参数 ...# shell模式


7.EXPOSE 3306/tcp  80/tcp  23/udp  # 声明要暴露的端口信息

8.ENV key1=val1  key2=val2  key3=val3  # 环境变量


9.COPY  ./file/ /data/  # 拷贝文件到镜像中

# 入口执行命令   可以在docker run加入参数 --entrypoint = command  覆盖掉
# 如果是exec数组形式,若存在CMD命令且CMD命令也是exec模式 则CMD作为附加参数给entrypoint
10.ENTRYPOINT ["可执行文件","参数1","参数2"]

11.VOLUME ["/lib","/data"] #挂载数据到此目录

12.USER  dreammo:root  # 用户名:组名称

13.WORKDIR  /data  # 进入容器层所处的目录。  记住 每一个RUN命令都是在一个镜像层  使用cd /data 仅仅只是在本层镜像有效  下一层镜像无效

14.ONBUILD RUN XXX # 当别人使用此镜像作为基础镜像build的时候 触发此命令

15.SHELL  ["/bin/bash","-c"] # 设置默认docker使用的shell  默认是 /bin/sh -c

16.HEALTHCHECK  options  CMD # 健康检查

 有3个参数:
  --interval=30s # 每隔30s检查一次
  --timeout=5s # 超时
  --retries=5  #当遇到错误 重新尝试检查5次

 有3个状态:
  0   健康
  1   不健康
  2   保留原值

HEALTHCHECK --interval=30s --timeout=10s --retries=5 CMD  curl -I http://localhost \ | grep 200 && exit 0 || exit 1
| grep 200
  

附加docker network内容:



Docker网络的4种模式:

1.host

不会使用namespace隔离。 复用 宿主机的网卡信息, 在容器操作就相当于在操作宿主机的网络。 但是其他是隔离的。

2.container

新创建的容器复用原容器(container)的网络信息,而不是新创建自己的网络信息。 其他还是通过namespace隔离的。

3.none

容器会创建自己的网卡 namespace隔离网络。但是 该网络不会有任何配置 例如 ip 网卡 路由等, 需要我们自己手动配置。

4.bridge # 桥接模式 (默认)

容器被namespace分配网络信息。然后连接到一个虚拟网桥上。彼此连接到同一个网桥上的容器,可以相互通信。