在Dockerfile中定义了很多关键字,通过关键字来完成Dockerfile的编写。

  Dockerfile官方文档

9.1 FROM

  在Dockerfile中FROM主要是指定这个Dockerfile基于哪一个base image构建。Docker Dockerfile按顺序运行指令。一个Dockerfile 必须用FROM指令启动,放在第一行。

FROM scratch        # 制作base image
FROM centos         # 使用base image
FROM ubuntu:14.04   # 使用指定版本的base image

安全起见,尽量使用官方的image作为base image。

9.2 LABEL

  在Dockerfile中LABEL实际上是英译了Metadata,就像是代码中的注释。主要包含了该镜像的作者、版本和描述信息。

LABEL maintainer="staryjie@163.com"
LABEL version="1.0"
LABEL description="This is description"

Metadata不可少!

9.3 RUN

  在Dockerfile中RUN用来运行命令,其中命令必须是在第一行FROM中指定的base image所能运行的。每运行一次RUN,构建的image都会生成新的一层layer。

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可以使用反斜杠换行。

为了避免无用分层,多条命令尽量合并一行。

9.4 WORKDIR

  在Dockerfile中WORKDIR用来设定当前工作目录,类似Linux系统中的cd命令。

WORKDIR /root
WORKDIR /test        # 如果没有该目录,则会自动创建
WORKDIR demo
RUN pwd # 输出的结果应该是/test/demo

用WORKDIR,不要使用RUN cd !!!

为了避免出错,尽量使用绝对路径。

9.4 ADD和COPY

  在Dockerfile中ADD和COPY作用相似,都是把本地的文件添加到docker image中。区别:ADD不仅可以添加文件,还可以解压缩文件,COPY不可以解压缩文件。

ADD hello /
ADD test.tar.gz /        # 添加到image的根目录并且解压
WORKDIR /root
ADD hello test/ # 将hello添加到image的/root/test/hello
WORKDIR /root
COPY hello test/ # 跟上面的效果一样

大部分情况下COPY优于ADD。

ADD除了COPY还有额外功能(解压)。

添加远程文件/目录,请使用curl或者wget。

9.5 ENV

  在Dockerfile中ENV来设置环境变量或者一些常量。可以在ENV设置的常量后面直接使用。

ENV MYSQL_VERSION 5.6        # 设置常量
RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \
&& rm -rf /var/lib/apt/lists/* #引用常量

尽量使用ENV增加可维护性!

9.6 VOLUME

  在Dockerfile中VOLUME用于向基于镜像创建的容器添加卷,一个卷可以存在于一个或多个容器的特定目录,这个目录可以绕过联合文件系统,并提供共享数据、数据持久化的功能。

VOLUME ["/data"]

9.7 EXPOSE

  在Dockerfile中EXPOSE设置容器暴露的端口,可以指定一个或多个端口。

EXPOSE 80

虽然在EXPOSE指令中已经暴露了指定的端口,但是在启动容器的时候还是要指定端口信息,容器本身不会自动暴露端口。

9.8 CMD

  在Dockerfile中CMD设置容器启动后默认执行的命令和参数。如果定义了多个CMD,只会执行最后一个。

CMD ["executable","param1","param2"]        # 执行形式,这是首选形式
CMD ["param1","param2"]                     # 作为进入点的默认参数
CMD command param1 param2                   # 壳形式

不要定义多个CMD,多个CMD只有最后一个会执行。

9.9 ENTRYPOINT

  在Dockerfile中ENTRYPOINT设置容器启动时运行的命令,可以让容器以应用程序或者服务器的形式运行,而且ENTRYPOINT设定的命令不会被忽略,一定会执行。

COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]

可以写一个shell脚本作为ENTRYPOINT的入口。

RUN、CMD、ENTRYPOINT对比

  • RUN 执行命令并创建新的image layer
  • CMD 设置容器启动后默认执行的命令和参数
  • ENTRYPOINT 设置容器启动时运行的命令

shell格式和exec格式

  • shell格式
RUN apt-get install -y vim
CMD echo "hello docker"
ENTRYPOINT echo "hello docker"

  Dockerfile

FROM centos
ENV name Docker
ENTRYPOINT echo "hello $name"

  构建镜像:

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

  运行容器:

docker run staryjie/centos-entrypoint-shell

hello Docker
  • exec格式
RUN ["apt-get","install","-y","vim"]
CMD ["/bin/echo","hello docker"]
ENTRYPOINT ["/bin/echo","hello docker"]

  Dockerfile

FROM centos
ENV name Docker
ENTRYPOINT ["/bin/echo","hello $name"]

  构建镜像:

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

  运行容器:

docker run staryjie/centos-entrypoint-exec

hello $name

  改写Dockerfile

FROM centos
ENV name Docker
ENTRYPOINT ["/bin/bash","-c","echo hello $name"]

  构建镜像:

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

  运行容器:

docker run staryjie/centos-entrypoint-exec-new

hello Docker
  1. CMD

    • 容器启动时默认执行的命令
    • 如果docker run指定了其他命令,CMD命令会被忽略
    • 如果定义了多个CMD,只有最后一个会执行
  2. ENTRYPOINT
    • 让容器以应用程序或者服务的形式运行
    • 不会被忽略,一定会执行

9、Dockerfile语法的更多相关文章

  1. 四:(之五)Dockerfile语法梳理和实践

    *5.Dockerfile语法梳理和实践 5.1 尽量使用官方的image作为base image 5.2 metadata:指明作者 版本 描述 5.3 每一条run都能形成一个分层,避免无用分层应 ...

  2. Dockerfile语法梳理

    Dockerfile语法 我们先来看一下上篇的 Dockerfile #获取base image FROM adoptopenjdk/openjdk8:latest #类似于执行 linux指令 RU ...

  3. dockerfile语法

    dockerfiles的指令不区分大小写,但约定为全部大写 dockerfiles支持如下语法命令: 1.FROM <image name> 所有的dockerfile都必须以from命令 ...

  4. dockerfile 语法

    基本语法格式:INSTRUCTION arguments (指令+参数)不分大小写 注释格式:# 注释 第一个指令必须是FROM,标示使用什么镜像 1.解析器指令 解析器指令是可选的,并且影响处理Do ...

  5. Dockerfile语法简介

    Dockerfile是由一系列命令和参数构成的脚本,一个Dockerfile里面包含了构建整个image的完整命令.Docker通过docker build执行Dockerfile中的一系列命令自动构 ...

  6. DockerFile语法【h】

    DockerFile在我理解就是可以将所需要构建镜像的功能.组件都天前配置好,然后直接生成一个Image,而不是先生成镜像,再通过修改容器的方法来生成最终需要的镜像.   镜像的定值实际上就是定值每一 ...

  7. 一文学会Dockerfile语法

    接应上篇,续讲前文.今天咱来聊一下Dockerfile的使用 . 虽然可以通过docker commit命令来手动创建镜像,但是通过Dockerfile文件,可以帮助我们自动创建镜像,并且能够自定义创 ...

  8. dockerfile语法规则

    编写Dockerfile 在前面的章节,我们学习了通过docker命令来下载镜像,运行镜像,在容器中部署自己的程序,最后将容器提交到自己的镜像中.但是,这并不是Docker推荐的镜像构建方式.在这一章 ...

  9. 四:(之八_Linux压力测试工具stress)Dockerfile语法梳理和实践

    8.1 安装stress stress目前是在该目录下的可执行文件 --vm 创建几个进程 --vm-bytes 为每个进程分配多少内存 8.2 debug输出stress创建进程的过程 一直在创建有 ...

  10. 四:(之六_镜像发布)Dockerfile语法梳理和实践

    *6.镜像发布 1>注册Docker Hub账号并登陆. build的镜像名称格式必须是: dockerhub账户名/标识: 使用docker login在项目目录下登录: 浏览器: 2> ...

随机推荐

  1. ruby里面的属性访问器

    和ios的@property一样 attr_accessor 表明是示例的getter和setter 下面的是rails的扩展,裸体class里面用,貌似会报错 cattr_accessor 表明是类 ...

  2. C# 播放器, 收藏

    C#写了一个调用libvlc api实现的万能视频播放器 http://www.cnblogs.com/haibindev/archive/2011/12/21/2296173.html 引用库 ht ...

  3. linux编程基本

    库的使用头文件:.h 里面的函数及变量的声明 比如#include <stdio.h> ,Linux下默认头文件的搜索路径 系统定义的头文件: /usr/include /usr/loca ...

  4. 用PHP收发邮件

    注:在WinForm下怎么试都不好使,最后没办法换成了PHP下,一试就好使了. 这里用到了phpmailer组件,网上有下. 转:phpnow支持ssl的方法 原文出处:http://blog.163 ...

  5. DAG最长路径

    1.DAG最长路径(不记录路径) int dfs1(int s) { )return dis[s]; ; i < G[s].size(); ++i) { int to = G[s][i]; di ...

  6. [maven] 实战笔记 - 构建、打包和安装maven

    ① 手工构建自己的maven项目 Maven 项目的核心是 pom.xml.POM (Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等 ...

  7. Linux下分析某个进程CPU占用率高的原因

      Linux下分析某个进程CPU占用率高的原因 通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用  1.top 查到占用cpu高的进程pid 2.查看该pid的线程 ...

  8. Gitlab 社区版安装部署和维护指南

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.这篇文章是在 Gitlab 7.4 的环境下配置的,相关内容可能已经过时. 后续做了一次迁移,将 Gitlab 升级到了 ...

  9. leetcode103

    class Solution { public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { vector&l ...

  10. 7 MySQL--记录的增删改查

    MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的DML语言 ...