码迷,mamicode.com
首页 > 其他好文 > 详细

Dockerfile定制镜像

时间:2021-06-06 19:13:27      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:守护进程   dev   直接   随机   数据   用法   指定路径   而且   shel   

1.Dockerfile是什么

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

2.一个构建流程示例

  • mkdir myNginx

  • cd myNginx/

  • touch Dockerfile

  • Dockerfile文件加入下面两行,并保存退出

    FROM nginx
    RUN echo ‘<h1>hello world<h1>‘ > /usr/share/nginx/html/index.html
    
  • 在Dockerfile所在目录执行docker build -t nginx:v3 .,注意最后的.

  • docker images查看刚刚构建的镜像

    技术图片

  • 执行docker run --name myNginx1 -d -p 80:80 adfeac0c1998启动容器,并把nginx默认80端口映射到宿主机80端口(如果宿主机是阿里云,需要将端口加入安全组)

  • 通过宿主机IP和端口验证一下:

    技术图片

3.Dockerfile指令详解

FROM

指定定制需要的基础镜像。后续的操作都是基于基础镜像。

RUN

用于执行后面跟着的命令行命令。两种格式:

1.RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。

2.RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

COPY

上下文目录中复制文件或者目录到容器里指定路径。格式:

COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>

1.源路径是相对于上下文目录的相对路径,COPY时用到的文件应该放在docker build时指定的上下文目录内
2.[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
3.源路径可以是通配符形式,目标路径如果不存在会自动创建

ADD

指令格式与COPY一样,功能也类似。不同之处在于:如果源文件是tar压缩文件,ADD会自动复制并解压到目标路径。

同样需求下,官方推荐使用 COPY。具体是否使用,可以根据是否需要自动解压来决定。

CMD

启动的容器指定默认要运行的程序及参数。如果docker run没有指定任何的执行命令或者

  • dockerfile里面没有ENTRYPOINT,那么docker run时就会使用CMD指定的默认的执行命令去运行程序。该默认命令会被docker run指定的命令覆盖。
  • dockerfile里面有ENTRYPOINT,那么CMD指定的会被当成ENTRYPOINT的参数。当然,该参数也会被docker run指定的参数覆盖。

与RUN类似,但两者运行时间的不同:

  • CMD 在docker run 时运行。(比如容器运行时执行程序命令等)
  • RUN 是在 docker build。(比如镜像构建时,安装软件拉取依赖等)
1.shell格式:CMD <shell 命令> 
2.exec格式:CMD ["<可执行文件或命令>","<param1>","<param2>",...] #推荐写法
3.CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效;CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

ENTRYPOINT

指定程序入口点,不会被docker run指令覆盖。

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

如果docker run命令后面有东西,那么后面的全部都会加入entrypoint的参数。如果docker run后面没有额外的东西,但是cmd有,那么cmd的全部内容会加入entrypoint的参数。

Dockerfile:

FROM centos

CMD ["b in cmd"]
ENTRYPOINT ["echo","a in entrypoint"]

docker run带参数和不带参数区别:

技术图片

总结下一般该怎么使用:
一般还是会用entrypoint的中括号形式作为docker 容器启动以后的默认执行命令,以及存放定参。可变参数比如命令参数可以使用cmd的形式提供默认版本,也就是run里面没有任何参数时使用的默认参数。如果我们想用默认参数,就直接docker run,否则想用其他参数,就docker run后面加参数。

ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

例如设置ENV NODE_VERSION 7.2.0, 在后续的指令中可以通过 $NODE_VERSION 引用。

EXPOSE

仅仅只是声明端口。一般真实映射端口,使用docker run的-p参数。

  • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

作用:

  • 避免重要的数据,因容器重启而丢失,这是非常致命的。
  • 避免容器不断变大。

格式:

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。

4.docker build创建镜像

docker build -t nginx:v3 .

基于Dockerfile和上下文(context),可以通过docker build命令来创建镜像,一般格式是docker build [选项] 路径

注意
1.这里的路径是指定上下文(context)的路径,不代表Dockerfile文件路径。产生误解的主要原因是:默认情况下会将上下文目录(Context)下的名为Dockerfile 的文件作为 Dockerfile。实际上 Dockerfile 的文件名并不要求必须为Dockerfile ,而且并不要求必须位于上下文目录(Context)中,比如可以用 -f ../Dockerfile.php 参数指定某个文件作为 Dockerfile 。
2.构建由 Docker 守护程序运行,而不是由 CLI 运行。构建过程做的第一件事是将整个上下文(递归地)上传到守护进程(并非上传到镜像,具体上传镜像是由ADD、COPY等命令)。在大多数情况下,最好从一个空目录作为上下文开始,并将 Dockerfile 保存在该目录中。仅添加构建 Dockerfile 所需的文件(例如ADD、COPY所需文件)。

-t:指定镜像标签信息
-f:如果要指定非上下文目录中的文件作为Dockerfile,可使用该参数。

拓展用法:

#docker build -t [镜像的名字及标签,通常 name:tag] -f [指定要使用的Dockerfile路径]  [ContextPath]
docker build -f /root/otherDir/otherFile -t nginx:v3 /root/myNginx

COPY  这类指令中的源文件的路径都是相对路径,./意味着(context) 目录。这也是为什么  COPY ../package.json /app  或者  COPY /opt/xxxx /app  无法工作的原因,因为这些路径已经超出了引擎中context的范围,Docker 引擎无法获得这些位置的文件。如果真的需要那些文件,应该将它们复制到context目录中去。

参考:
https://www.runoob.com/docker/docker-dockerfile.html
https://docs.docker.com/engine/reference/builder/
https://blog.csdn.net/weixin_43002202/article/details/108735549
https://blog.csdn.net/u010900754/article/details/78526443

Dockerfile定制镜像

标签:守护进程   dev   直接   随机   数据   用法   指定路径   而且   shel   

原文地址:https://www.cnblogs.com/tang-hao/p/14851645.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!