加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

编写Dockerfiles的优秀实践

发布时间:2019-09-17 22:53:08 所属栏目:建站 来源:架构师之路
导读:本文档先容了构建高效镜像的优越实践和要领。 Docker通过从Dockerfile(按次序包括构建给定镜像所需的全部呼吁的文本文件)读取呼吁来自动构建镜像。Dockerfile遵循特定的名目和一组呼吁,您可以在Dockerfile reference中找到这些呼吁。 Docker镜像由只读层
副问题[/!--empirenews.page--]

本文档先容了构建高效镜像的优越实践和要领。

编写Dockerfiles的优越实践

Docker通过从Dockerfile(按次序包括构建给定镜像所需的全部呼吁的文本文件)读取呼吁来自动构建镜像。Dockerfile遵循特定的名目和一组呼吁,您可以在Dockerfile reference中找到这些呼吁。

Docker镜像由只读层构成,每个只读层暗示Dockerfile指令。这些层被堆叠起来,每一层都是前一层变革的增量。思量一下这个Dockerfile:

  1. FROM ubuntu:18.04 
  2. COPY . /app 
  3. RUN make /app 
  4. CMD python /app/app.py 

每一个指令会建设一个层:

  • FROM从docker image ubuntu:18.04 建设层 。
  • COPY从Docker 客户端添加文件到当前目次。
  • RUN行使make 呼吁构建应用。
  • CMD指定在容器里运行的呼吁。

当您运行一个镜像并天生一个容器时,您将在底层之上添加一个新的可写层("容器层")。对正在运行的容器所做的全部变动,譬喻写入新文件、修改现有文件和删除文件,都被写入这个可写容器层。

通用概览和提议

建设姑且容器

Dockerfile界说的镜像应该天生尽也许"短暂"的容器。所谓"姑且性",是指容器可以遏制和烧毁,然后用绝对最小的配置和设置从头构建和替代。

领略构建上下文

当您发出docker构建呼吁时,当前事变目次称为构建上下文。默认环境下, Dockerfile在当前目次,可是您可以行使file符号(-f)指定一个差异的位置。无论Dockerfile现实位于那里,当前目次中文件和目次的全部递归内容都作为构建上下文发送到Docker保卫历程。

构建上下文:

为构建上下文建设一个目次并将cd放入个中。将"hello"写入一个名为hello的文本文件中,并建设一个运行cat的Dockerfile。从构建上下文中构建镜像(.):

  1. mkdir myproject && cd myproject 
  2. echo "hello" > hello 
  3. echo -e "FROM busyboxnCOPY /hello /nRUN cat /hello" > Dockerfile 
  4. docker build -t helloapp:v1 . 

将Dockerfile和hello移到单独的目次中,并构建镜像的第二个版本(不依靠于上一个构建的缓存)。行使-f指向Dockerfile并指定构建上下文的目次:

  1. mkdir -p dockerfiles context 
  2. mv Dockerfile dockerfiles && mv hello context 
  3. docker build --no-cache -t helloapp:v2 -f dockerfiles/Dockerfile context 

有时中包括了构建镜像所不必要的文件,会导致构建上下文和镜像巨细变大。这可以增进构建镜像的时刻、拖放镜像的时刻和容器运行时巨细。要查察构建上下文的巨细,请在构建Dockerfile时查察相同这样的动静:

  1. Sending build context to Docker daemon 187.8MB 

通过stdin行使Dockerfile 管道

Docker可以或许通过行使当地或长途构建上下文通过stdin管道传输Dockerfile来构建镜像。通过stdin管道传输Dockerfile对付执行一次性构建很是有效,不必要将Dockerfile写入磁盘,可能在天生Dockerfile的环境下,不该该在天生后生涯Dockerfile。

为了利便起见,本节中的示例行使here文档【http://tldp.org/LDP/abs/html/here-docs.html】,可是可以行使在stdin上提供Dockerfile的任何要领。

譬喻: 下面的呼吁是等价的:

  1. echo -e 'FROM busyboxnRUN echo "hello world"' | docker build - 
  2. docker build -<<EOF 
  3. FROM busybox 
  4. RUN echo "hello world" 
  5. EOF 

您可以用您喜好的要领可能最得当您用例的要领来更换这些例子。

行使STDIN中的DOCKERFILE构建镜像,而不发送构建上下文

行使此语法可以从stdin顶用Dockerfile构建映像,而不必要发送特另外文件作为构建上下文。连字符(-)占有路径的位置,指示Docker从stdin而不是目次中读取构建上下文(个中只包括Dockerfile):

  1. docker build [OPTIONS] – 

下面的示例行使通过stdin转达的Dockerfile构建一个镜像。没有文件作为构建上下文发送到保卫历程。

  1. docker build -t myimage:latest -<<EOF 
  2. FROM busybox 
  3. RUN echo "hello world" 
  4. EOF 

在Dockerfile不必要将文件复制到镜像中的环境下,省略构建上下文长短常有效的,而且可以进步构建速率,由于没有文件被发送到保卫历程。

留意:假如行使这种语法,实行构建行使COPY或ADD的Dockerfile将会失败。下面的例子声名白这一点:

  1. # create a directory to work in 
  2. mkdir example 
  3. cd example 
  4. # create an example file 
  5. touch somefile.txt 
  6. docker build -t myimage:latest -<<EOF 
  7. FROM busybox 
  8. COPY somefile.txt . 
  9. RUN cat /somefile.txt 
  10. EOF 
  11. # observe that the build fails 
  12. ... 
  13. Step 2/3 : COPY somefile.txt . 
  14. COPY failed: stat /var/lib/docker/tmp/docker-builder249218248/somefile.txt: no such file or directory 

行使STDIN中的DOCKERFILE从当地构建上下文构建

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读