hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

Docker之构建上下文详解

2019-11-18杂谈搜奇网43°c
A+ A-

昨天写了运用 Dockerfile 定制镜像。个中构建高低文这一块没有写,本日把这一块零丁拿出来写一下。

Docker镜像构建

简朴说下构建镜像步骤:

  1. cd Dockerfile 地点目次;
  2. 实行 docker build 构建敕令:

    docker build -t .

经由过程上面的事情流,很轻易构成如许的明白误区:

  1. docker build 背面的 . 为 Dockerfile 地点的目次;
  2. Dockerfile 文件名 必需为 Dockerfile;

实在上面这类明白是毛病的,要想正确明白其寄义,起首我们须要先了解下 Docker 的架构和 docker build 的事情道理。

Docker架构

Docker 运用C/S (客户端/服务器)体系的架构,Docker 客户端与 Docker 保卫历程通讯,Docker 保卫历程担任构建,运转和分发 Docker 容器。Docker 客户端和保卫历程能够在同一个体系上运转,也能够将 Docker 客户端连接到长途 Docker 保卫历程。Docker 客户端和保卫历程运用 REST API 经由过程UNIX套接字或收集接口举行通讯。

docker build 的事情道理

  1. Client端实行 docker build . 敕令 ;
  2. Docker 客户端会将构建敕令背面指定的途径(.)下的统统文件打包发送给 Docker 服务端;
  3. Docker 服务端收到客户端发送的包,然后解压,依据 Dockerfile 内里的指令举行镜像的分层构建;

镜像构建高低文(Context)

当我们举行镜像构建的时刻,并不是统统定制都邑经由过程 RUN 指令完成,经常会须要将一些当地文件复制进镜像,比方经由过程 COPY 指令、ADD 指令等。而 docker build 敕令构建镜像,实在并不是在当地构建,而是在服务端,也就是 Docker 引擎中构建的。那末在这类客户端/服务端的架构中,怎样才能让服务端取得当地文件呢?

这就引入了高低文的观点。当构建的时刻,用户会指定构建镜像高低文的途径,docker build 敕令得知这个途径后,会将途径下的统统内容打包,然后上传给 Docker 引擎。如许 Docker 引擎收到这个高低文包后,睁开就会取得构建镜像所需的统统文件。假如在 Dockerfile 中这么写:

COPY ./package.json /app/

这并不是要复制实行 docker build 敕令地点的目次下的 package.json,也不是复制 Dockerfile 地点目次下的 package.json,而是复制 高低文(context) 目次下的 package.json。

因而,COPY这类指令中的源文件的途径都是相对途径。这也是初学者经常会问的为何 COPY ../package.json /app 或许 COPY /opt/xxxx /app 没法事情的缘由,由于这些途径已超出了高低文的局限,Docker 引擎没法取得这些位置的文件。假如真的须要那些文件,应当将它们复制到高低文目次中去。

示例1 :

[root@192 test]# ls
Dockerfile
[root@192 test]# cat Dockerfile
FROM alpine:latest
ADD  /root/mydocker/apache-tomcat-9.0.27.tar.gz /data/soft
[root@192 test]# ls /root/mydocker/apache-tomcat-9.0.27.tar.gz
/root/mydocker/apache-tomcat-9.0.27.tar.gz
[root@192 test]# docker build  .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM alpine:latest
 ---> 965ea09ff2eb
Step 2/2 : ADD /root/mydocker/apache-tomcat-9.0.27.tar.gz /data/soft
ADD failed: stat /var/lib/docker/tmp/docker-builder904012777/root/mydocker/apache-tomcat-9.0.27.tar.gz: no such file or directory

能够看出:

  1. 镜像构建高低文途径并不是 Dockerfile文件地点的途径;
  2. Dockerfile 中指令的事情目次是服务端解压客户端传输包的途径,由于 ADD 指令失利了,意味着当前目次并没有 apache-tomcat 文件;

明白构建高低文关于镜像构建是很主要的,能够防止犯一些不应当的毛病。比方有些初学者在发明 COPY /opt/xxxx /app 不事情后,因而痛快将 Dockerfile 放到了硬盘根目次去构建,效果发明 docker build 实行后,在发送一个几十 GB 的东西,极为迟缓而且很轻易构建失利。那是由于这类做法是在让 docker build 打包全部硬盘,这显然是运用毛病。

平常来说,应当会将 Dockerfile 置于一个空目次下,或许项目根目次下。假如该目次下没有所需文件,那末应当把所需文件复制一份过来。假如目次下有些东西确切不愿望构建时传给 Docker 引擎,那末能够用 .gitignore 一样的语法写一个.dockerignore,该文件是用于剔除不须要作为高低文传递给 Docker 引擎的。

那末为何会有人误以为 . 是指定 Dockerfile 地点目次呢?这是由于在默许情况下,假如不分外指定 Dockerfile 的话,会将高低文目次下的名为 Dockerfile 的文件作为 Dockerfile。

这只是默许行动,实际上 Dockerfile 的文件名并不请求必需为 Dockerfile,而且并不请求必需位于高低文目次中,比方能够用-f ../Dockerfile.php参数指定某个文件作为 Dockerfile。

固然,平常人人习惯性的会运用默许的文件名 Dockerfile,以及会将其置于镜像构建高低文目次中。

示例2

[root@192 test]# docker images
REPOSITORY                         TAG                         IMAGE ID            CREATED             SIZE
tomcat                             jdk8-adoptopenjdk-hotspot   1a2bfb3e6eee        15 hours ago        318MB
openjdk                            8-jre-slim                  d0cfe439ce3d        13 days ago         184MB
btnguyen2k/oraclejdk8_jre-alpine   latest                      fab475620d00        4 years ago         208MB
[root@192 test]# cat ../mynginx/test
FROM alpine:latest
[root@192 test]# ls
apache-tomcat-9.0.27.tar.gz
[root@192 test]#  docker build -f ../mynginx/test  -t test:v1 .
Sending build context to Docker daemon  10.99MB
Step 1/1 : FROM alpine:latest
latest: Pulling from library/alpine
89d9c30c1d48: Already exists
Digest: sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a
Status: Downloaded newer image for alpine:latest
 ---> 965ea09ff2eb
Successfully built 965ea09ff2eb
Successfully tagged test:v1
[root@192 test]# docker images
REPOSITORY                         TAG                         IMAGE ID            CREATED             SIZE
tomcat                             jdk8-adoptopenjdk-hotspot   1a2bfb3e6eee        15 hours ago        318MB
alpine                             latest                      965ea09ff2eb        11 days ago         5.55MB
test                               v1                          965ea09ff2eb        11 days ago         5.55MB
openjdk                            8-jre-slim                  d0cfe439ce3d        13 days ago         184MB
btnguyen2k/oraclejdk8_jre-alpine   latest                      fab475620d00        4 years ago         208MB     

能够看出:

Dockerfile 的文件名并不请求必需为 Dockerfile,而且并不请求必需位于高低文目次中,比方能够用-f ../mynginx/test参数指定某个文件作为 Dockerfile。

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
Docker之构建上下文详解

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282337.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>