Dockerfile指令

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位置]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值