Docker学习中...(3)Dockerfile语法

Dockerfile名必须叫Dockerfile
Dokerfile官方文档: Dockerfile reference
参考: https://github.com/docker-library
FROM
Dockerfile中的FROM是指定这个Dockerfile是基于哪个bash image构建的,Dockerfile是按顺序运行的指令。一个Dockerfile是用FROM指定启动的,必须放在第一行
> FROM scratch  #不依赖其他bash image自己从头创建一个bash image
> FROM centos   #利用已有的bash image,在其上build image
<*>尽量使用官方的bash image作为bash image,因为安全
LABEL
Dockerfile中的LABEL是类似与java中的注释描述的作用,必须有LABEL
> LABEL maintainer="lijinlongonly@163.com"  #作者
> LABEL version="1.0"                       #描述
> description="dockerfile demo"             #信息
RUN
Dockerfile中的Run用来执行命令,所运行的命令必须是在FROM中指定的bash image中是可以执行的,每运行一条run就会在image中新加一条layer,在编写run是
为了美观最好用"\"来进行换行写命令
为了避免无用分层,合并多条命令为一行RUN(指的是layer分层)
> RUN yum update && yum install -y vim    \
      python-dev
WORKDIR
Dockerfile中的WORKDIR相当于linux中的cd命令,在Dockerfile中不要使用cd,要使用WORKDIR来取代,而且最好使用绝对路径,因为不确定有多少层目录,cd只能切换目录,而WORKDIR则会在切换目录时如果目录不存在就创建目录,如果存在就切换目录
> WORKDIR /opt/test
> WORKDIR mydir
> RUN pwd   #会返回/opt/test/mydir
ADD和COPY
Dockerfile中的ADD和COPY效果都是将本地文件添加到bash 
image中,只不过ADD可以解压缩文件,COPY不可以
添加远程文件或目录要使用"RUN curl ..."或者"RUN wget ..."
> ADD abc.tar.gz /  #将abc.tar.gz添加到根目录下并解压缩
> COPY abc.tar.gz / #将abc.tar.gz添加到根目录不解压缩
例:
    WORKDIR /test
    ADD abc demo/   
    RUN pwd         #返回/test/demo/abc
ENV
Dockerfile中ENV是用来设置环境变了或者一些常量的,可以在ENV设置常量后直接使用,尽量使用ENV可以增强Dockerfile的可维护性(比如有多个地方使用了这个常量,需要进行修改时不使用ENV的话,得一个一个改,如果使用了ENV那么就只修改ENV设置的常量值就可以了)
> ENV MYSQL_VERSION 5.6
> RUN yum install -y mysql_service="${MYSQL_VERSION}"
CMD
Dockerfile中CMD是设置容器启动后默认执行的命令和参数
容器启动时默认执行的命令
如果docker run指定了其他命令,CMD会被忽略
如果定义了多个CMD,只会执行最后一个CMD
ENTRYPOINT
Dockerfile中ENTRYPOINT是设置容器启动时执行的命令
让容器以应用程序或服务的形式运行
一定会执行,不会被忽略
Dockerfile中的Shell格式和Exec格式
shell格式:
    RUN apt-get install -y vim
    CMD echo "hello docker"
    ENTRYPOINT echo "hello dockers"
exec格式:
    RUN ["apt-get","install","-y","vim"]
    CMD ["/bin/echo","hello docker"]
    ENTRYPOINT ["/bin/echo","hello docker"]
例: shell格式:
    FROM centos
    RUN apt-get install -y vim
    ENV HELLO hello
    ENTRYPOINT echo "$HELLO"
    ——>docker build -t lijinlong666/entrypoint-shell .
    ——>docker run lijinlong666/entrypoint-shell #会输出hello
    
    exec格式:
    FROM centos
    RUN ["apt-get","install","-y","vim"]
    ENV HELLO hello
    ENTRYPOINT ["/bin/echo","$HELLO"]
    ——>docker build -t lijinlong666/entrypoint-exec .
    ——>docker run lijinlong666/entrypoint-exec  #会输出$HELLO
    #原因是没有用解释器来执行echo命令,而是直接执行echo
    #如果也要输出hello,那么ENTRYPOINT就要改为↓
    ENTRYPOINT ["/bin/bash","-c","echo $HELLO"]
    #修改为Dockerfile要重新build然后执行才可以生效
练习1
目的:使用Dockerfile创建一个应用程序镜像
CentOS上的python没有预装pip
    yum -y install epel-release
    yum install python-pip  #即可安装成功
    pip install --upgrade pip   #更新一下
>pull一个python2.7
>>docker pull python:2.7
>创建Dockerfile
>>vim Dockerfile
>>FROM python:2.7
>>LABEL maintainer="<lijinlongonly@163.com>"
>>RUN pip install flask
>>COPY app.py /app/
>>WORKDIR /app
>>EXPOSE 5000
>>CMD ["python","app.py"]
>build Dockerfile
>>docker build -t lijinlong666/dockerpythontest1 .
>>docker run -d lijinlong666/dockerpythontest1 #加-d参数为后台运行
练习2
目的:使用Dockerfile创建一个工具(例子为stress测试压力工具)
    stress是一个工具,需要通过yum install stress来安装
    它具有可选参数,如: --vm 1:为常见一个进程,默认大小为256M
                        --verbose:打印详细输出
    >创建Dockerfile
        >>vim Dockerfile
        >>FROM ubuntu   #基于ubuntu创建镜像
        >>RUN apt-get update && apt-get install -y stress   #更新安装stress
        >>ENTRYPOINT ["/usr/bin/stress"]    #执行stress
        >>CMD []    #在运行时可以挂载参数
    >build Dockerfile
        >>docker build -t lijinlong666/stressutils .
    >执行压力工具镜像(创建一个进程以默认大小执行打印详细信息)
        >>docker run -it lijinlong666/stressutils --vm 1 --verbose
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值