博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
『中级篇』Dockerfile详解(17)
阅读量:5952 次
发布时间:2019-06-19

本文共 3284 字,大约阅读时间需要 10 分钟。

一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

####官网学习

『中级篇』Dockerfile详解(17)

####FROM

必须为第一个命令,指定基础镜像

FROM FROM :
FROM
@
FROM scratch #制作base ImageFROM centos #使用base ImageFROM centos:7.9FROM mysql:5.6

尽量使用官方的image作为base image!那是经得起考验的!

####LABEL

给镜像添加信息。使用docker inspect可查看镜像的相关信息

LABEL maintainer="394498036@qq.com"LABEL version="1.0"LABEL description="This is description \欢迎关注:编程坑太多,我在等你."

其实就类似咱们写代码的注释,很多人写代码不愿意写注释,其实写注释对自己的负责,过段时间翻坑的时候,想想当初的意思,容易很快的解决,所以一定要写LABEL

####RUN

构建镜像时执行的命令

RUN yum update && yum install -y vim \python-dev #反斜线换行
RUN  apt-get update && apt-get install -y perl \          pwgen --no-install-recommends && rm -rf \          /var/lib/apt/lists/*   #注意清理cache
RUN  /bin/bash -c 'source $HOME/.bashrc;echo $HOME'

为了美观,复杂的RUN请用反斜线换行,避免无用分层,合并多条命令成一行!

####WORKDIR

工作目录

WORKDIR /test #如果没有会自动创建test目录WORKDIR jianshuRUN pwd          #输出结果应该是/test/jianshu

用WORKDIR,不要用RUN cd 尽量使用绝对目录!

####ADD and COPY

  1. 将本地文件添加到容器中,identity, gzip, bzip2,xz,tar.gz,tgz等类型的文件将被添加tar -x命令,进行解压
  2. 同ADD,只是不会解压文件。
    ADD <src>... <dest>ADD ["<src>",... "<dest>"] 用于支持包含空格的路径COPY <src>... <dest>COPY ["<src>",... "<dest>"] 用于支持包含空格的路径
    ADD hello /ADD test.tar.gz / #添加到根目录并解压WORKDIR /rootADD hello test/ # /root/test/hello
WORKDIR /rootCOPY hello test/ # /root/test/hello

大部分情况,COPY优于ADD,ADD除了COPY还有额外功能(解压缩)!添加远程文件/目录请使用curl 或者wget

####ENV

设置环境变量

ENV 
ENV
=
...
ENV MYSQL_VERSION 5.6E-NV apt-get install -y mysql-server = "${MYSQL_VERSION}" \&& rm -rf /var/lib/apt/lists/* #引用常亮

尽量多使用,减少维护成本!

学习下面的先了解下

Shell 和Exec 格式

  • Shell格式
    RUN apt-get install -y vimCMD echo "hello docker  微信公众号:编程坑太多"ENTRYPOINT echo "hello docker 微信公众号:编程坑太多"
  • Exec格式
    RUN ["apt-get", "install", " -y", "vim"]CMD ["/bin/echo","hello docker  微信公众号:编程坑太多"]ENTRYPOINT ["/bin/echo","hello docker 微信公众号:编程坑太多"]

  • Dockerfile1
    FROM centosENV name DockerENTRYPOINT  echo "hello  $name"
  • Dockerfile2
    FROM centosENV name DockerENTRYPOINT ["/bin/echo", "hello  $name"]

    通过实际的例子查看区别。

    mkdir cmd-entrrypointcd cmd-entrrypoint/vi Dockerfile
  • 先执行Dockerfile1
    『中级篇』Dockerfile详解(17)
more Dockerfile

『中级篇』Dockerfile详解(17)

docker build -t liming/centos-entrypoint-shell .

『中级篇』Dockerfile详解(17)

docker run liming/centos-entrypoint-shell

『中级篇』Dockerfile详解(17)

  • 先执行Dockerfile2
    『中级篇』Dockerfile详解(17)
more Dockerfile

『中级篇』Dockerfile详解(17)

docker build -t  liming/centos-entrypoint-exec .

『中级篇』Dockerfile详解(17)

docker run  liming/centos-entrypoint-exec

『中级篇』Dockerfile详解(17)

我们通过shell格式运行的话,它会通过默认的bash里面通过shell执行命令,它会通过shell替换这边变量,通过exec格式运行的话,只是单纯的执行echo,没办法帮我们替换到$name。如何解决不一样的问题呢?请开始我的表演!修改Dockerfile2

FROM centosENV name DockerENTRYPOINT ["/bin/bash","-c", "echo hello  $name"]

『中级篇』Dockerfile详解(17)

docker build -t liming/centos-entrypoint-exec-new .

『中级篇』Dockerfile详解(17)

docker run liming/centos-entrypoint-exec-new

『中级篇』Dockerfile详解(17)

『中级篇』Dockerfile详解(17)

是不是很nice!

####CMD

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

  • 容器启动时默认执行的命令
  • 如果docker run 指定了其他命令,CMD命令被忽略
  • 如何定义了多个CMD,只有最后一个会执行

『中级篇』Dockerfile详解(17)

FROM centosENV name DockerCMD echo "hello $name"

『中级篇』Dockerfile详解(17)

docker build -t liming/centos-cmd-shell .docker run liming/centos-cmd-shelldocker run -it liming/centos-cmd-shell /bin/bash

『中级篇』Dockerfile详解(17)

####ENTRTYPOINT

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

  • 让容器以应用程序或者服务的形式运行
  • 不会被忽略,一定会执行

『中级篇』Dockerfile详解(17)

FROM centosENV name DockerENTRYPOINT echo "hello $name"

『中级篇』Dockerfile详解(17)

docker build -t liming/centos-entrypoint-shell .docker run liming/centos-entrypoint-shelldocker run -it liming/centos-entrypoint-shell /bin/bash

『中级篇』Dockerfile详解(17)

个人网站: idig8.com

PS:Dockerfile详解基本就介绍这么多,可能还有很多命令没有讲解,以后用到了在说吧。一定要CMD和ENTRTYPOINT因为很多官方的都常用这两个命令。


往期精彩

image

转载于:https://blog.51cto.com/12040702/2154833

你可能感兴趣的文章
Android 自动判断是电话,网址,EMAIL方法之Linkify
查看>>
Java Quartz 自动调度
查看>>
VS2012:出现devenv.sln解决方案保存对话框
查看>>
ubuntu 10.10下面添加samba实现和windows共享文件
查看>>
参数过滤mongodb过滤查询键值
查看>>
关于技术的学习及批判
查看>>
转发网络《iOS网络编程与云端应用最佳实践》微博转发送书了
查看>>
车牌识别及验证码识别的一般思路
查看>>
hdu 3560(dfs判环)
查看>>
C/C++头文件一览
查看>>
HTML <img> 标签的 border 属性
查看>>
写一个方法,用一个for循环打印九九乘法表
查看>>
mooon编译系统介绍(可复用Makefile)
查看>>
《无间道》观后感
查看>>
ios 读取各种类型文件
查看>>
每日英语:Do Bicycle Helmet Laws Really Make Riders Safer?
查看>>
Spring Validation
查看>>
poj 3335 Rotating Scoreboard - 半平面交
查看>>
Python:Python学习总结
查看>>
uboot命令及内核启动参数
查看>>