专栏名称: 编程坑太多
原创身边IT人的真实故事,每周固定3篇!分享微服务docker,Java,Python的项目文章。感谢您的关注!
目录
51好读  ›  专栏  ›  编程坑太多

Dockerfile详解(17)

编程坑太多  · 公众号  ·  · 2018-06-17 12:29

正文

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

官网学习

https://docs.docker.com/engine/reference/builder/#usage

FROM

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

  1. FROM

  2. FROM :<tag>

  3. FROM @<digest>

  1. FROM scratch #制作base Image

  2. FROM centos #使用base Image

  3. FROM centos:7.9

  4. FROM mysql:5.6

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

LABEL

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

  1. LABEL maintainer="[email protected]"

  2. LABEL version="1.0"

  3. LABEL description="This is description \

  4. 欢迎关注:编程坑太多,我在等你."

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

RUN

构建镜像时执行的命令

  1. RUN yum update && yum install -y vim \

  2.          python-dev #反斜线换行

  1. RUN  apt-get update && apt-get install -y perl \

  2.          pwgen --no-install-recommends && rm -rf \

  3.          /var/lib/apt/lists/*   #注意清理cache

  1. RUN  /bin/bash -c 'source $HOME/.bashrc;echo $HOME'

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

WORKDIR

工作目录

  1. WORKDIR /test #如果没有会自动创建test目录

  2. WORKDIR jianshu

  3. RUN pwd          #输出结果应该是/test/jianshu

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

ADD and COPY

  1. 将本地文件添加到容器中,identity, gzip, bzip2,xz,tar.gz,tgz等类型的文件将被添加tar -x命令,进行解压

  2. 同ADD,只是不会解压文件。

  1. ADD ...

  2. ADD ["",... ""] 用于支持包含空格的路径

  3. COPY ...

  4. COPY ["",... ""] 用于支持包含空格的路径

  1. ADD hello /

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

  3. WORKDIR /root

  4. ADD hello test/ # /root/test/hello

  1. WORKDIR /root

  2. COPY hello test/ # /root/test/hello

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

ENV

设置环境变量

  1. ENV

  2. ENV =<value> ...

  1. ENV MYSQL_VERSION 5.6

  2. E-NV apt-get install -y mysql-server = "${MYSQL_VERSION}" \

  3. && rm -rf /var/lib/apt/lists/* #引用常亮

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

学习下面的先了解下

Shell 和Exec 格式

  • Shell格式

  1. RUN apt-get install -y vim

  2. CMD echo "hello docker  微信公众号:编程坑太多"

  3. ENTRYPOINT echo "hello docker 微信公众号:编程坑太多"

  • Exec格式

  1. RUN ["apt-get", "install", " -y", "vim"]

  2. CMD ["/bin/echo","hello docker  微信公众号:编程坑太多"]

  3. ENTRYPOINT ["/bin/echo","hello docker 微信公众号:编程坑太多"]


  • Dockerfile1

  1. FROM centos

  2. ENV name Docker

  3. ENTRYPOINT  echo "hello  $name"

  • Dockerfile2

  1. FROM centos

  2. ENV name Docker

  3. ENTRYPOINT ["/bin/echo", "hello  $name"]

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

  1. mkdir cmd-entrrypoint

  2. cd cmd-entrrypoint/

  3. vi Dockerfile

`

  • 先执行Dockerfile1 

  1. more Dockerfile

`

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

`

  1. docker run liming/centos-entrypoint-shell

`

  • 先执行Dockerfile2 

  1. more Dockerfile

`

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

`

  1. docker run  liming/centos-entrypoint-exec

`

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

  1. FROM centos

  2. ENV name Docker

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

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

  1. docker run liming/centos-entrypoint-exec-new

是不是很nice!

CMD

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

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

  • 如果docker run 指定了其他命令,CMD命令被忽略

  • 如何定义了多个CMD,只有最后一个会执行

  1. FROM centos

  2. ENV name Docker

  3. CMD echo "hello $name"

  1. docker build -t liming/centos-cmd-shell .

  2. docker run liming/centos-cmd-shell

  3. docker run -it liming/centos-cmd-shell /bin/bash

ENTRTYPOINT

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

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

  • 不会被忽略,一定会执行

  1. FROM centos

  2. ENV name Docker

  3. ENTRYPOINT echo "hello $name"

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

  2. docker run liming/centos-entrypoint-shell

  3. docker run -it liming/centos-entrypoint-shell /bin/bash

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





往期精彩
  1. docker导学(一)

  2. 容器的技术概述(二)

  3. docker的魅力初体验-5分钟安装wordpress不走弯路(三)

  4. docker官网介绍(四)

  5. 如何在mac上安装docker(五)

  6. 如何在window上安装docker(六)

  7. 如何在mac上通过vagrant安装虚拟机(七)

  8. 如何在window上通过vagrant安装虚拟机(八)

  9. docker-Machine的本地使用(九)

  10. docker-Machine的本地使用(十)

  11. 在linux/mac下通过Docker-Machine在阿里云上的使用(11)

  12. docker架构和底层技术(12)

  13. docker Image概述(13)

  14. 手动建立一个base Image(14)

  15. 什么是Container(15)

  16. 构建自己的Docker镜像(16)