Dockerfile学习And构建Hexo镜像

  • 时间:
  • 浏览:3
  • 来源:uu快3下载网址_uu快3IOS下载_电脑版

刚刚说过每一一另八个 RUN 与非 启动一一另八个 容器、执行命令、有刚刚提交存储层文件变更。第一层 RUN cd /app 的执行仅仅是当前进程的工作目录变更,一一另八个 内存上的变化而已,其结果不需要造成任何文件变更。而到第二层的刚刚,启动的是一一另八个 全新的容器,跟第一层的容器更全部没关系,自然不需要可能 继承前一层构建过程中的内存变化。

除了选则现有镜像为基础镜像外,Docker 还处在一一另八个 特殊的镜像,名为 scratch。你你是什么 镜像是虚拟的概念,不需要实际处在,它表示一一另八个 空白的镜像。

CMD 指令可是用于指定默认的容器主进程的启动命令的。

在运行时都要指定新的命令来替代镜像设置中的你你是什么 默认命令,比如,ubuntu 镜像默认的 CMD/bin/bash,不可能 当我们当我们 直接 docker run -it ubuntu 一段话,会直接进入 bash。当我们当我们 也都要在运行时指定运行别的命令,如 docker run -it ubuntu cat /etc/os-release。这可是用 cat /etc/os-release 命令替换了默认的 /bin/bash 命令了,输出了系统版本信息。

当然,和 WORKDIR 一样,USER 可是帮助你切换到指定用户而已,你你是什么 用户都可是刚刚建立好的,有刚刚无法切换。

其中<repo-name>表示仓库名,与远程仓库(如docker hub)名字要一致,<tag>表示标签,不给默认latest,与非 可选项,类事都要写成从前:

此篇记录构建Hexo的镜像踩坑~

ENTRYPOINT 的格式和 RUN 指令格式一样,分为 exec 格式和 shell 格式。

比如 <源路径> 都可是一一另八个 URL,你你是什么 情况报告下,Docker 引擎会试图去下载你你是什么 链接的文件里装 <目标路径> 去。下载后的文件权限自动设置为 1000,不可能 这并与非 你要的权限,这样还都要增加额外的一层 RUN进行权限调整,另外,不可能 下载的是个压缩包,都要解压缩,也一样还都要额外的一层 RUN 指令进行解压缩。可是 不如直接使用 RUN 指令,有刚刚使用 wget 不可能 curl 工具下载,除理权限、解压缩、有刚刚清理无用文件更合理。有刚刚,你你是什么 功能觉得不需要实用,有刚刚不推荐使用。

这里的 /data 目录就会在运行时自动挂载为匿名卷,任何向 /data 中写入的信息与非 会记录进容器存储层,从而保证了容器存储层的无情况报告化。当然,运行时都要覆盖你你是什么 挂载设置。比如:

在 Docker 官方的最佳实践文档中要求,尽不可能 的使用 COPY,不可能 COPY 的语义很明确,可是克隆qq好友好友文件而已,而 ADD 则暗含了更比较复杂的功能,其行为可是一定很清晰。最适合使用 ADD 的场合,可是所提及的都要自动解压缩的场合。

ex:

原文链接: http://yangbingdong.com/2017/note-of-dockefile-and-build-hexo-docker-image/

有刚刚在 COPYADD 指令中选则的刚刚,都要遵循从前的原则,所有的文件克隆qq好友好友均使用 COPY 指令,仅在都要自动解压缩的场合使用 ADD

注意docker build 命令最后有一一另八个 .表示构建的上下文,镜像构建都要把上下文的东西上传到Docker引擎去构建。

格式为:

在 Docker Hub上有非常多的高质量的官方镜像, 有都要直接拿来使用的服务类的镜像,如 nginxredismongomysqlhttpdphptomcat 等; 与非 可是方便开发、构建、运行各种语言应用的镜像,如 nodeopenjdkpythonrubygolang 等。 都要在其中寻找一一另八个 最符合当我们当我们 最终目标的镜像为基础镜像进行定制。 不可能 这样找到对应服务的镜像,官方镜像中还提供了可是更为基础的操作系统镜像,如 ubuntudebiancentosfedoraalpine 等,哪此操作系统的软件库为当我们当我们 提供了更广阔的扩展空间。

可是 不可能 使用shell格式会原因容器莫名退出,不可能 实际上执行的事sh命令,而sh命令执行完刚刚容器也就这样处在的意义。

CMD 指令的格式和 RUN 类事,也是一种格式:

但在可是情况报告下,不可能 当我们当我们 真的是希望克隆qq好友好友个压缩文件进去,而不解压缩,这时就不都要使用 ADD 命令了。

格式为 EXPOSE <端口1> [<端口2>...]

EXPOSE 指令是声明运行时容器提供服务端口,这可是一一另八个 声明,在运行时不需要会不可能 你你是什么 声明应用就会开启你你是什么 端口的服务。在 Dockerfile 中写入从前的声明有一另八个 好处,一一另八个 是帮助镜像使用者理解你你是什么 镜像服务的守护端口,以方便配置映射;从前用处则是在运行时使用随机端口映射时,也可是 docker run -P时,会自动随机映射 EXPOSE 的端口。

不可能 将你你是什么 Dockerfile 进行构建镜像运行后,会发现找这样 /app/world.txt 文件,不可能 其内容与非 hello。原因觉得很简单,在 Shell 中,连续两行是同一一另八个 进程执行环境,有刚刚前一一另八个 命令修改的内存情况报告,会直接影响后一一另八个 命令;而在 Dockerfile 中,这两行 RUN 命令的执行环境根本不同,是一另八个 全部不同的容器。这可是对 Dokerfile 构建分层存储的概念不了解所原因的错误。

首先在当前空目录创建一一另八个 Dockerfile:

RUN 指令是用来执行命令行命令的。不可能 命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有一种:

要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。-p,是映射宿主端口和容器端口,换句话说,可是将容器的对应端口服务公开给外界访问,而 EXPOSE 仅仅是声明容器打算使用哪此端口而已,不需要会自动在宿主进行端口映射。

所谓定制镜像,那一定是以一一另八个 镜像为基础,在其上进行定制。而 FROM 可是指定基础镜像,有刚刚一一另八个 DockerfileFROM 是必备的指令,有刚刚都可是第三根指令。

参考:Docker从入门到实践

注意

不可能 docker commit是一一另八个 暗箱操作,除了制作镜像的人知道执行过哪此命令、为何生成的镜像,别人根本无从得知,有刚刚会加入可是没用的操作原因镜像臃肿

构建参数和 ENV 的效果一样,与非 设置环境变量。所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不需要处在哪此环境变量的。有刚刚不需要有刚刚就使用 ARG 保存密码类事的信息,不可能 docker history 还是都要看过所有值的。

刚刚提到可是初学者常犯的错误是把 Dockerfile 等同于 Shell 脚从前书写,你你是什么 错误的理解还不可能 会原因再次出现下面从前的错误:

格式:

docker-entrypoint.sh :

格式为 WORKDIR <工作目录路径>

使用 WORKDIR 指令都要来指定工作目录(不可能 称为当前目录),刚刚各层的当前目录就被改为指定的目录,如该目录不处在,WORKDIR 会帮你建立目录。

USER 指令和 WORKDIR 类事,与非 改变环境情况报告并影响刚刚的层。WORKDIR 是改变工作目录,USER则是改变刚刚层的执行 RUN, CMD 以及 ENTRYPOINT 类事命令的身份。

制作一一另八个 镜像都要使用docker commit和定制Dockerfile,但推荐的是写Dockerfile。

在可是情况报告下,你你是什么 自动解压缩的功能非常有用,比如官方镜像 ubuntu 中:

在这行命令中,就使用了 mydata 你你是什么 命名卷挂载到了 /data 你你是什么 位置,替代了 Dockerfile 中定义的匿名卷的挂载配置。

此外,在早期 Docker 版本中还有一一另八个 特殊的用处。刚刚所有容器都运行于默认桥接网络中,有刚刚所有容器互相之间都要直接访问,从前处在一定的安全性什么的问题。于是有了一一另八个 Docker 引擎参数 --icc=false,当指定该参数后,容器间将默认无法互访,除非互相间使用了 --links 参数的容器才都要互通,有刚刚这样镜像中 EXPOSE 所声明的端口才都要被访问。你你是什么 --icc=false 的用法,在引入了 docker network后不可能 基本不需要了,通过自定义网络都要很轻松的实现容器间的互联与隔离。

在实际执行中,会将其变更为:

ADD 指令和 COPY 的格式和性质基本一致。有刚刚在 COPY 基础上增加了可是功能。

格式:USER <用户名>

在指令格式上,一般推荐使用 exec 格式,类事格式在解析可不上能 被解析为 JSON 数组,有刚刚一定要使用双引号 ",而不需要使用单引号。

COPY 指令将从构建上下文目录中 <源路径> 的文件/目录克隆qq好友好友到新的一层的镜像内的 <目标路径> 位置。比如:

你你是什么 指令非常有用,类事都要把命令里边的参数传进来或启动容器前准备可是环境有刚刚执行启动命令(通过脚本exec "$@")。

ENTRYPOINT 的目的和 CMD 一样,与非 在指定容器启动进程及参数。ENTRYPOINT 在运行时也都要替代,不过比 CMD 要略显繁琐,都要通过 docker run 的参数 --entrypoint 来指定。

你你是什么 指令很简单,可是设置环境变量而已,无论是里边的其它指令,如 RUN,还是运行时的应用,都要直接使用这里定义的环境变量。

格式有一种:

最后献上踩坑写的Hexo Dockerfile:

有刚刚在当前目录打开终端:

当指定了 ENTRYPOINT 后,CMD 的含义就处在了改变,不再是直接的运行其命令,可是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为:

另外都要注意的是,ADD 指令会令镜像构建缓存失效,从而不可能 会令镜像构建变得比较缓慢。

不可能 使用 shell 格式一段话,实际的命令会被包装为 sh -c 的参数的形式进行执行。比如:

有刚刚不可能 都要改变刚刚各层的工作目录的位置,这样应该使用 WORKDIR 指令。

刚刚当我们当我们 说过,容器运行时应该尽量保持容器存储层不处在写操作,对于数据库类都要保存动态数据的应用,其数据库文件应该保存于卷(volume)中,里边的章节当我们当我们 会进一步介绍 Docker 卷的概念。为了除理运行时用户忘记将动态文件所保存目录挂载为卷,在 Dockerfile 中,当我们当我们 都要刚刚指定可是目录挂载为匿名卷,从前在运行时不可能 用户不指定挂载,其应用也都要正常运行,不需要向容器存储层写入大量数据。

源码:https://github.com/masteranthoneyd/docker-hexo

RUN 指令一样,与非 一种格式,一种类事于命令行,一种类事于函数调用。

看过Successfully built就表示构建成功了

在 1.13 刚刚的版本,要求 --build-arg 中的参数名,都要在 Dockerfile 中用 ARG 定义过了,换句话说,可是 --build-arg 指定的参数,都要在 Dockerfile 中使用了。不可能 对应参数这样被使用,则会报错退出构建。从 1.13 刚开始,你你是什么 严格的限制被放开,不再报错退出,可是显示警告信息,并继续构建。这对于使用 CI 系统,用同样的构建流程构建不同的 Dockerfile 的刚刚比较有帮助,除理构建命令都要根据每个 Dockerfile 的内容修改。

格式:ARG <参数名>[=<默认值>]

Dockerfile 中的 ARG 指令是定义参数名称,以及定义其默认值。该默认值都要在构建命令 docker build 中用 --build-arg <参数名>=<值> 来覆盖。

不可能 <源路径> 为一一另八个 tar 压缩文件一段话,压缩格式为 gzip, bzip2 以及 xz 的情况报告下,ADD 指令不可能 自动解压缩你你是什么 压缩文件到 <目标路径> 去。