『中级篇』Dockerfile详解(17)

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

官网学习

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

FROM

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

FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
FROM scratch #制作base Image
FROM centos #使用base Image
FROM centos:7.9
FROM 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 jianshu
RUN 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 /root
ADD hello test/ # /root/test/hello
WORKDIR /root
COPY hello test/ # /root/test/hello

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

ENV

设置环境变量

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

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

学习下面的先了解下

Shell 和Exec 格式

  • Shell格式
RUN apt-get install -y vim
CMD 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 centos
ENV name Docker
ENTRYPOINT  echo "hello  $name"
  • Dockerfile2
FROM centos
ENV name Docker
ENTRYPOINT ["/bin/echo", "hello  $name"]

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

mkdir cmd-entrrypoint
cd cmd-entrrypoint/
vi Dockerfile

`

  • 先执行Dockerfile1
more Dockerfile

`

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

`

docker run liming/centos-entrypoint-shell

`

  • 先执行Dockerfile2
more Dockerfile

`

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

`

docker run  liming/centos-entrypoint-exec

`

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

FROM centos
ENV name Docker
ENTRYPOINT ["/bin/bash","-c", "echo hello  $name"]
docker build -t liming/centos-entrypoint-exec-new .
docker run liming/centos-entrypoint-exec-new

是不是很nice!

CMD

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

  • 容器启动时默认执行的命令
  • 如果docker run 指定了其他命令,CMD命令被忽略
  • 如何定义了多个CMD,只有最后一个会执行
FROM centos
ENV name Docker
CMD echo "hello $name"
docker build -t liming/centos-cmd-shell .
docker run liming/centos-cmd-shell
docker run -it liming/centos-cmd-shell /bin/bash

ENTRTYPOINT

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

  • 让容器以应用程序或者服务的形式运行
  • 不会被忽略,一定会执行
FROM centos
ENV name Docker
ENTRYPOINT echo "hello $name"
docker build -t liming/centos-entrypoint-shell .
docker run liming/centos-entrypoint-shell
docker run -it liming/centos-entrypoint-shell /bin/bash

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


原文发布于微信公众号 - 编程坑太多(idig88)

原文发表时间:2018-06-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏苍云横渡学习笔记

【Docker学习笔记(三)】Dockerfile解析

Dockerfile 是用来构建 Docker 镜像的构建文件,其是由一系列指令和参数构成的脚本

913
来自专栏张善友的专栏

Mongo Database 性能优化

SQL Server有工具进行数据库的优化,Mongo Database Profiler.不仅有,而且功能更强大。 MongoDB 自带 Profiler,可...

25910
来自专栏从零开始学自动化测试

selenium+python自动化88-用例不通过的时候发送邮件

前言 实现需求:当测试用例全部通过的时候,不发邮件,当用例出现Error或Failure的时候发送邮件 解决思路:生成html测试报告后,用bs4解析html页...

3455
来自专栏WindCoder

为form表单相关组件添加适用于手机上的背景

将主要的代码记录分享出来,以下内容当初是为了适应于手机端,PC端直接引用会出现格式问题,具体的大家自己修改css样式吧,Dome会在最后放出一个整体的。

472
来自专栏文渊之博

SQL 扩展事件

    在本篇,我通过使用新建“Session ”对话框来创建新的扩展事件会话。定义一个自己的扩展事件,动作和谓词,并且发布一个以收集事件数据为目的的会话。 首...

1907
来自专栏吴小龙同學

Python 爬虫实战(一):使用 requests 和 BeautifulSoup

Python 基础 我之前写的《Python 3 极简教程.pdf》,适合有点编程基础的快速入门,通过该系列文章学习,能够独立完成接口的编写,写写小东西没问题。...

3476
来自专栏xingoo, 一个梦想做发明家的程序员

Elasticsearch使用REST API实现全文检索

通过rest api添加检索数据,阅读官方文档可以发现,elasticsearch支持动态映射,但是其中有不少问题,且听慢慢详解。 本文主要讲述三点内容: ...

1897
来自专栏我有一个梦想

vc++ 在程序中运行另一个程序的方法

在vc++ 程序中运行另一个程序的方法有三个: WinExec(),ShellExcute()和CreateProcess() 三个SDK函数: WinExec...

1819
来自专栏乐沙弥的世界

RAC 环境下的重要参数

    Oracle 数据库启动时会根据参数文件中提供的相关参数启动Oracle实例。这些参数包括数据库名字、sga,pga的分配,控制文件的位置,undo,p...

441
来自专栏Python、Flask、Django

Ajax与php进行数据交互

1092

扫码关注云+社区