Dockerfile 详解

######################################################################################

文章中有错或者其他问题请联系小弟:[email protected]

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

为什么要使用Dockerfile

Dockerfile 能搭建出一抹一样的环境来,而且操作方便,简单,环境一致

注:base images需统一, 可以从灵鹊云,数字云,阿里云中直接pull。直接在官方dockerhub中pull实在是太慢了,还经常失败

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Dockerfile 语法如下,跟我们熟悉的shell一样,是顺序向下执行的。

Dockerfile 执行与注意点

docker build .
docker build -t centos:7 .
docker build -t centos:7 -t centos:latest .
docker build -f /path/docker/file/Dockerfile .

tips:

1. 整个build过程是由Docker daemon 控制的,并非CLI
2. Dockerfile 尽量别放到node的 ‘/‘ 目录下,否则会将整个根目录全部send到docker daemon
3. Docker build 过程中每一行是独立的(有点类似Makefile),所如果前面定义RUN cd /tmp ,后面定义 RUN touch file ,这个file一定不会在/tmp下面

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Environment replacement

Dockerfile 中的变量是有ENV定义。变量比较有意思,有好多中写法,大家研究一下看:

1. $foo , ${foo}
3. \$foo ,\${foo}
4. ${fool_name} ,$fool_name, ${fool}_cont
5. ${variable:-word} , 如果$variable 没有设置,那么传递的值就是word
6. ${variable:+word} ,如果$variable 已经设置,那么传递的值就是word

并非所有的Dockerfile指令都能support ENV ,我们看看有哪些能够support:

ADD,COPY,ENV,EXPOSE,LABEL,USER,WORKDIR,VOLUME,STOPSIGNAL

目前就只有这么多了

注:在Dockerfile同一行中ENV环境变量是保持不替换的,什么意思呢?我们看个例子就很清楚了。

ENV abc=hello
ENV abc=bye def=$abc
ENV ghi=$abc

结果 def=hello, ghi=bye,

因为在第二个ENV中,abc变量虽然是有被重新赋值,但是因为跟def赋值是在同一行,所以了结果就是依然是上一行的值,是不是很有趣:)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#Comment

#INSTRUCTION arguments

FROM <images:tag>
ex: FROM  centos:6.6

如果没有对应的images,那么会直接从公共的dockerhub中pull(当然直接dockerhub的server就是另外一回事了)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

MAINTANER <name>

ex: MAINTAINER GuiQiu<[email protected]>

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

RUN <command>

两种模式,一种是shell模式,这种模式等于说是/bin/sh -c command这样执行

ex: 
RUN echo "$NAME is my friend"
RUN yum install -y mysql              python
RUN /bin/bash -c ‘source $HOME/.bashrc ;         echo $HOME‘

另一种模式,exec模式 ,因为这种模式将option当作JSON array来parser的,所以一定是要使用双引号的。

RUN ["executable", "param1", "param2"]
ex:
RUN ["/bin/bash", "-c", "echo hello"]
RUN [ "echo", "$HOME" ]

在exec模式中,如果有变量,那么在parser的时候,是不传值的,要记得。

tips:在测试阶段,Dockerfile一直频繁的修改,所以我们在build的时候,有时候不希望使用上一版或上几版的cache,可以使用下面的命令避免(个人感觉还蛮有作用的)

docker build --no-cache

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
ENTRYPOINT command param1 param2 (shell form)

用此option可以避免使用Dockerfile中定义的ENTRYPOINT值:--entrypoint=flag

tips:

1. 如果CMD 是给ENTRYPOINT 提供参数的话,那么必须使用JSON格式,也就是必须要双引号(不是单引号)

2. ENTRYPOINT CMD 区别是 ENTRYPOINT的指令不会被user指定的命令overwrite,而是当作参数使用;CMD定义的指令会直接被overwrite

3. CMD RUN 的区别,RUN指令会在build过程中指令且commit,然而CMD 却只是定义到images中,不会在build的过程中执行,只是在container启动的时候执行

4. 当container别当成一个执行档来用的时候,比较难建议使用ENTRYPOINT + CMD 执行一些参数

5. Dockerfile 必须定义ENTRYPOINT CMD其中之一

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

ADD/COPY
ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]

tips:

1. ADD / COPY 都是复制的作用,但是ADD 可以直接复制url而COPY则需要先download下来然后才能复制,当然如果url中有需要密码认证的话,还是必须通过其他的方式来先得到内容才能复制

2. src的路径必须包含在Dockerfile所在的路径下

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

USER daemon

以什么user来运行此container

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

WORKDIR path

container 开启之后default路径

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

[[email protected] dockerfile]# cat Dockerfile
FROM  centos:test

MAINTAINER GUIQIU<[email protected]>

ENV FILENAME DOCKERFILE
ENV MYNAME=zhangsan YOURNAME=lisi

RUN yum install -y xclock

RUN yum install -y openssh-server 		   openssh-clients

RUN ["mkdir", "-p" ,"/d/test"]

RUN useradd zhangsan

ADD README /root/

COPY README /d/test

WORKDIR /d

USER zhangsan

CMD /bin/bash
[[email protected] dockerfile]# cat Dockerfile1
FROM  centos:test

MAINTAINER GUIQIU<[email protected]>

ENV FILENAME DOCKERFILE
ENV MYNAME=zhangsan YOURNAME=lisi

RUN yum install -y xclock

RUN yum install -y perl \ 
		openssh-server 		openssh-clients

RUN ["mkdir", "-p" ,"/d/test"]

ADD README /root/

COPY README /d/test

WORKDIR /d

CMD /bin/bash
[[email protected] dockerfile]# cat Dockerfile2
FROM  centos:test

MAINTAINER GUIQIU<[email protected]>

ENV FILENAME DOCKERFILE
ENV MYNAME=zhangsan YOURNAME=lisi

RUN yum install -y xclock

RUN yum install -y perl \ 
		openssh-server 		openssh-clients

RUN ["mkdir", "-p" ,"/d/test"]

ADD README /root/

COPY README /d/test

WORKDIR /d

ENTRYPOINT ["/bin/bash"]
[[email protected] dockerfile]# cat Dockerfile3
FROM  centos:test

MAINTAINER GUIQIU<[email protected]>

ENV FILENAME DOCKERFILE
ENV MYNAME=zhangsan YOURNAME=lisi

RUN yum install -y xclock

RUN yum install -y perl \ 
		openssh-server 		openssh-clients

RUN ["mkdir", "-p" ,"/d/test"]

ADD README /root/

COPY README /d/test

WORKDIR /d

ENTRYPOINT ["/usr/bin/echo","ThisIsTest"]
时间: 2024-10-26 05:29:19

Dockerfile 详解的相关文章

Dockerfile详解(二)

Dockerfile文件详解 什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档.可以使用在命令行中调用任何命令. Docker通过读取Dockerfile中的指令自动生成映像. docker build命令用于从Dockerfile构建映像.可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile. 例: docker build -f /path/to/a/Dockerfile Dockerfile的基本结构 Dock

Dockerfile详解,以及构建自定义镜像

Dockerfile使用 前面的操作我们一直下载下载官方已经构建好的镜像,直接下载后就可以run,如果我们想要在镜像中添加自己的应用,比如在tomcat中添加自己的app,构建一个自定义的镜像,那么我们应该怎么做,这个时候就用到了Dockerfile.Dockerfile是由一系列命令和参数构成的脚本,Docker可以根据这个脚本基于某个基础镜像创建一个新的定制化的镜像,大大提高了我们部署的效率,使用Dockfile最终的结果是帮助我们定制化自己的镜像. Dockerfile初体验 下面就基于t

Docker Dockerfile详解

dockerfike快速创建自定义的Docker镜像 一.目录 1.docker典型结构 2.指令介绍 3.创建docker镜像 二.结构 DockerFile分为四部分组成:基础镜像信.维护者信息.镜像操作指令和容器启动时执行指令.例如: #第一行必须指令基于的基础镜像 From ubutu #维护者信息 MAINTAINER docker_user [email protected] #镜像的操作指令 apt/sourcelist.list RUN apt-get update &&

Docker 使用指南 (五)—— Dockerfile 详解

版权声明:本文由田飞雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/97 来源:腾云阁 https://www.qcloud.com/community 制作Docker image 有两种方式:一是使用 Docker container,直接构建容器,再导出成 image 使用:二是使用 Dockerfile,将所有动作卸载文件中,再 build 成 image.Dockerfile 的方式非常灵活,推荐使用. 本次

Dockerfile详解(三)

1.概述 创建Docker镜像的方式有三种 docker commit命令:由容器生成镜像: Dockerfile文件+docker build命令: 从本地文件系统导入:OpenVZ的模板. 关于这三种方式的大致说明请参考yeasy/docker_practice的创建镜像. 最近学习了Dockerfile文件的相关配置,这里做一下简单的总结,并对之前一直感到有些迷惑的CMD和ENTRYPOINT指令做个差异对比. 2.Dockerfile文件总结 Dockerfile 由一行行命令语句组成,

docker 实践六:dockerfile 详解

本篇开始来学习关于 dockerfile 的知识. 注:环境为 CentOS7,docker 19.03. dockerfile 是?个?本格式的配置?件, ?户可以使? dockerfile 来快速创建?定义的镜像. 指令系统 dockerfile 主要是通过一个指令来实现想要的功能的.dockerfile 支持的指令如下 ARG 定义创建镜像过程中使?的变量.格式为: ARG<name>[=<default value>] 在执?docker build时, 可以通过 -bui

(转)Docker入门——Dockerfile详解

转:https://www.cnblogs.com/sorex/p/6481407.html 基本示例 FROM MAINTAINER LABEL RUN ADD COPY CMD ENTRYPOINT ENV EXPOSE VOLUME WORKDIR USER ARG 基本示例 # This is a commit FROM alpine:3.2 MAINTAINER Jasper Xu <[email protected]163.com> RUN apk update &&

Dockerfile详解

Docker instructions FROM FROM指令是最重要的一个且必须为Dockerfile文件开篇的第一个非注释行,用于为映像文件构建过程指  定基准镜像,后续的指令运行与此基准镜像所提供的运行环境. 实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上查找指定的  镜像文件,在其不存在时,则会从Docker Hub Registry上拉取所需要的镜像文件 如果找不到指定的镜像文件,Docker build会返回一个错误信息 Synta

8、Dockerfile详解

除了init之外,每一个进程都应该是其他进程的子进程(init是内核启动的),当手动启动nginx时,那么这个nginx就以shell子进程存在.当打开一个命令行提示符时,这个就相当于在运行一个shell进程,当在shell命令行中运行一个命令时,就相当于运行一个shell子进程. RUN和CMD的区别 CMD是定义一个镜像文件启动为容器时默认要运行的程序,docker容器默认只运行一个程序,所以CMD只能一个(当CMD有多个时,只能最后一个生效).但RUN 可以有多个,RUN命令时逐一运行的.