ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Dockerfile定制镜像

2021-06-06 09:02:23  阅读:191  来源: 互联网

标签:run 指定 参数 镜像 定制 Dockerfile docker


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查看刚刚构建的镜像

    image

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

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

    image

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带参数和不带参数区别:

image

总结下一般该怎么使用:
一般还是会用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

标签:run,指定,参数,镜像,定制,Dockerfile,docker
来源: https://www.cnblogs.com/tang-hao/p/14851645.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有