Dockerfile介绍与指令解析

一.Dockerfile介绍

镜像是容器的基础,每次执行docker run的时候都会指定哪个镜像作为容器运行的基础。我们之前的例子都是使用来自docker hub的镜像,直接使用这些镜像只能满足一定的需求,当镜像无法满足我们的需求时,就得自定制这些镜像。

镜像的定制就是定制每一层所添加的配置、文件。如果可以把每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

二.Dockerfile指令解析

1. FROM参数(指定基础镜像)

FROM scratch # 制作base image基础镜像,尽量使用官方的image作为base image

FROM centos # 以centos为基础镜像,进行二次构建镜像

FROM ubuntu:14.04 # 带有tag的base image

2. LABEL参数(标签, 定义作者信息)

LABEL version=“1.0” # 容器元信息,帮助信息,Metadata,类似于代码注释

LABEL maintainer=”zero@163.com" # 标签表示作者信息

3. RUN参数(是一个万能指令,执行命令)

#对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!

RUN yum update && yum install -y vim \

    Python-dev # 反斜线换行

RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”

4. WORKDIR参数(相当于linux的cd命令)

WORKDIR /root # 相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd

WORKDIR /test # 如果没有就自动创建

WORKDIR demo # 再进入demo文件夹

RUN pwd     # 打印结果应该是/test/demo

5. ADD参数(把宿主机的一个文件,添加到容器空间内)

ADD /opt/django/manage.py /opt/  # 把宿主机的/opt/django/manage.py放到容器空间内的/opt/目录下

ADD /opt/python3.6.tar.gz /opt/  # ADD的解压文件作用,将宿主机的/opt/下的python3.6.tar.gz解压到容器内的/opt/目录下

ADD and COPY

ADD hello /  #把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录

ADD test.tar.gz /  #添加到根目录并解压

 

WORKDIR /root

ADD hello test/  # 进入/root/ 添加hello可执行命令到test目录下,也就是/root/test/hello 一个绝对路径

COPY hello test/  # 等同于上述ADD效果

6. COPY参数(拷贝指令)

# 将宿主机的文件, 拷贝到容器内,但是没有解压缩的命令,尽量使用COPY,不要使用ADD

COPY filename /opt/

ADD与COPY

   - 优先使用COPY命令

    -ADD除了COPY功能还有解压功能

添加远程文件/目录使用curl或wget

7. ENV参数(docker的环境参数指令)

ENV # 环境变量,尽可能使用ENV增加可维护性

ENV MYSQL_VERSION 5.6 # 设置一个mysql常量,这个${MYSQL_VERSION}类似于全局常量

RUN yum install -y mysql-server=“${MYSQL_VERSION}”  # 如果版本号有变更,则只需要改这个常量就可以了

8.VOLUME and EXPOSE

存储和网络

RUN and CMD and ENTRYPOINT

RUN:执行命令并创建新的Image Layer

CMD:设置容器启动后默认执行的命令和参数

ENTRYPOINT:设置容器启动时运行的命令

 

Shell格式和Exec格式

RUN yum install -y vim

CMD echo ”hello docker”

ENTRYPOINT echo “hello docker

9.Exec格式

RUN [“apt-get”,”install”,”-y”,”vim”]

CMD [“/bin/echo”,”hello docker”]

ENTRYPOINT [“/bin/echo”,”hello docker”]

通过shell格式去运行命令,会读取$name指令,而exec格式是仅仅的执行一个命令,而不是shell指令

cat Dockerfile

    FROM centos

    ENV name Docker

    ENTRYPOINT [“/bin/echo”,”hello $name”]#这个仅仅是执行echo命令,读取不了shell变量

    ENTRYPOINT  [“/bin/bash”,”-c”,”echo hello $name"]

10.CMD

容器启动时默认执行的命令

如果docker run指定了其他命令(docker run -it [image] /bin/bash ),CMD命令被忽略

如果定义多个CMD,只有最后一个执行

11.ENTRYPOINT

让容器以应用程序或服务形式运行

不会被忽略,一定会执行

最佳实践:写一个shell脚本作为entrypoint

COPY docker-entrypoint.sh /usr/local/bin

ENTRYPOINT [“docker-entrypoint.sh]

EXPOSE 27017

CMD [“mongod”]

[root@master home]# more DockerfileFROm centos

ENV name Docker#CMD ["/bin/bash","-c","echo hello $name"]

ENTRYPOINT ["/bin/bash","-c","echo hello $name”]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值