doc: Update docker.md dockerfile cheatsheet. f7f71e5070

This commit is contained in:
jaywcjlove
2022-10-01 13:21:03 +00:00
parent 31bdb80ef4
commit 2d29a6c38d
3 changed files with 88 additions and 14 deletions

View File

@ -52,7 +52,7 @@
<pre class="language-dockerfile"><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">FROM</span> ruby:2.2.2</span>
</span><span class="code-line line-number" line="2"><span class="token instruction"><span class="token keyword">FROM</span> golang:1.19-alpine3.16 <span class="token keyword">AS</span> build-env</span>
</span></code></pre>
</div></div></div><div class="wrap"><div class="wrap-header h3wrap"><h3 id="变量"><a aria-hidden="true" tabindex="-1" href="#变量"><span class="icon icon-link"></span></a>变量</h3><div class="wrap-body">
</div></div></div><div class="wrap"><div class="wrap-header h3wrap"><h3 id="变量-env"><a aria-hidden="true" tabindex="-1" href="#变量-env"><span class="icon icon-link"></span></a>变量 ENV</h3><div class="wrap-body">
<pre class="language-dockerfile"><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">ENV</span> &#x3C;key>=&#x3C;value> ...</span>
</span></code></pre>
<pre class="language-dockerfile"><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">ENV</span> APP_HOME /myapp</span>
@ -64,32 +64,61 @@
</div></div></div><div class="wrap row-span-2"><div class="wrap-header h3wrap"><h3 id="初始化"><a aria-hidden="true" tabindex="-1" href="#初始化"><span class="icon icon-link"></span></a>初始化</h3><div class="wrap-body"><!--rehype:wrap-class=row-span-2 -->
<pre class="language-dockerfile"><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">RUN</span> bundle install</span>
</span></code></pre>
<p><code>WORKDIR</code> 指令为任何 <code>RUN</code><code>CMD</code><code>ENTRYPOINT</code><code>COPY</code><code>ADD</code> 指令设置工作目录。</p>
<pre class="language-dockerfile"><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">WORKDIR</span> /myapp</span>
</span></code></pre>
<p><code>VOLUME</code> 指令创建一个具有指定名称的挂载点,并将其标记为保存来自本机主机或其他容器的外部挂载卷。</p>
<pre class="language-dockerfile"><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">VOLUME</span> [<span class="token string">"/data"</span>]</span>
</span><span class="code-line line-number" line="2"><span class="token comment"># 安装点规范</span>
</span></code></pre>
<pre class="wrap-text "><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">ADD</span> file.xyz /file.xyz</span>
</span><span class="code-line line-number" line="2"><span class="token instruction"><span class="token keyword">COPY</span> <span class="token options"><span class="token property">--chown</span><span class="token punctuation">=</span><span class="token string">user:group</span></span> host_file.xyz /path/container_file.xyz</span>
</span><span class="code-line line-number" line="2"><span class="token comment"># 复制</span>
</span><span class="code-line line-number" line="3"><span class="token instruction"><span class="token keyword">COPY</span> <span class="token options"><span class="token property">--chown</span><span class="token punctuation">=</span><span class="token string">user:group</span></span> host_file.xyz /path/container_file.xyz</span>
</span></code></pre><!--rehype:className=wrap-text -->
</div></div></div><div class="wrap"><div class="wrap-header h3wrap"><h3 id="onbuild"><a aria-hidden="true" tabindex="-1" href="#onbuild"><span class="icon icon-link"></span></a>Onbuild</h3><div class="wrap-body">
<pre class="language-dockerfile"><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">ONBUILD</span> <span class="token keyword">RUN</span> bundle install</span>
<pre class="wrap-text "><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">ONBUILD</span> <span class="token keyword">RUN</span> bundle install</span>
</span><span class="code-line line-number" line="2"><span class="token comment"># 与另一个文件一起使用时</span>
</span></code></pre>
</div></div></div><div class="wrap"><div class="wrap-header h3wrap"><h3 id="命令"><a aria-hidden="true" tabindex="-1" href="#命令"><span class="icon icon-link"></span></a>命令</h3><div class="wrap-body">
<pre class="language-dockerfile"><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">EXPOSE</span> 5900</span>
</span><span class="code-line line-number" line="2"><span class="token instruction"><span class="token keyword">CMD</span> [<span class="token string">"bundle"</span>, <span class="token string">"exec"</span>, <span class="token string">"rails"</span>, <span class="token string">"server"</span>]</span>
</span></code></pre>
</span><span class="code-line line-number" line="3">
</span><span class="code-line line-number" line="4"><span class="token instruction"><span class="token keyword">ONBUILD</span> <span class="token keyword">ADD</span> . /app/src</span>
</span><span class="code-line line-number" line="5"><span class="token instruction"><span class="token keyword">ONBUILD</span> <span class="token keyword">RUN</span> /usr/local/bin/python-build --dir /app/src</span>
</span></code></pre><!--rehype:className=wrap-text -->
<p>指令将触发指令添加到镜像中,以便稍后执行,此时镜像用作另一个构建的基础。</p>
</div></div></div><div class="wrap"><div class="wrap-header h3wrap"><h3 id="在严格的-shell-中运行命令"><a aria-hidden="true" tabindex="-1" href="#在严格的-shell-中运行命令"><span class="icon icon-link"></span></a>在严格的 shell 中运行命令</h3><div class="wrap-body">
<pre class="wrap-text "><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">ENV</span> my_var</span>
</span><span class="code-line line-number" line="2"><span class="token instruction"><span class="token keyword">SHELL</span> [<span class="token string">"/bin/bash"</span>, <span class="token string">"-euo"</span>, <span class="token string">"pipefail"</span>, <span class="token string">"-c"</span>]</span>
</span><span class="code-line line-number" line="3"><span class="token comment"># With strict mode:</span>
</span><span class="code-line line-number" line="3"><span class="token comment"># 使用严格模式:</span>
</span><span class="code-line line-number" line="4"><span class="token instruction"><span class="token keyword">RUN</span> false # ails 像使用 &#x26;&#x26; 一样构建</span>
</span><span class="code-line line-number" line="5"><span class="token instruction"><span class="token keyword">RUN</span> echo <span class="token string">"$myvar"</span> # 由于拼写错误会抛出错误</span>
</span><span class="code-line line-number" line="6"><span class="token instruction"><span class="token keyword">RUN</span> true | false # 将脱离管道</span>
</span></code></pre><!--rehype:className=wrap-text -->
<p>使用 <code>shell</code> 将为 shell 命令打开严格模式。</p>
</div></div></div><div class="wrap"><div class="wrap-header h3wrap"><h3 id="入口点"><a aria-hidden="true" tabindex="-1" href="#入口点"><span class="icon icon-link"></span></a>入口点</h3><div class="wrap-body">
</div></div></div><div class="wrap col-span-2"><div class="wrap-header h3wrap"><h3 id="命令-cmd"><a aria-hidden="true" tabindex="-1" href="#命令-cmd"><span class="icon icon-link"></span></a>命令 CMD</h3><div class="wrap-body"><!--rehype:wrap-class=col-span-2-->
<table>
<thead>
<tr>
<th align="left">:-</th>
<th>-</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><code>CMD ["executable","param1","param2"]</code></td>
<td>(exec 形式,这是首选形式)</td>
</tr>
<tr>
<td align="left"><code>CMD ["param1","param2"]</code></td>
<td>(作为 ENTRYPOINT 的默认参数)</td>
</tr>
<tr>
<td align="left"><code>CMD command param1 param2</code></td>
<td>(shell形式)</td>
</tr>
</tbody>
</table>
<pre class="language-dockerfile"><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">EXPOSE</span> 5900</span>
</span><span class="code-line line-number" line="2"><span class="token instruction"><span class="token keyword">CMD</span> [<span class="token string">"bundle"</span>, <span class="token string">"exec"</span>, <span class="token string">"rails"</span>, <span class="token string">"server"</span>]</span>
</span></code></pre>
</div></div></div><div class="wrap"><div class="wrap-header h3wrap"><h3 id="入口点-entrypoint"><a aria-hidden="true" tabindex="-1" href="#入口点-entrypoint"><span class="icon icon-link"></span></a>入口点 ENTRYPOINT</h3><div class="wrap-body">
<pre class="wrap-text "><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">ENTRYPOINT</span> [<span class="token string">"executable"</span>, <span class="token string">"param1"</span>, <span class="token string">"param2"</span>]</span>
</span><span class="code-line line-number" line="2"><span class="token instruction"><span class="token keyword">ENTRYPOINT</span> command param1 param2</span>
</span></code></pre><!--rehype:className=wrap-text -->
@ -97,7 +126,7 @@
<pre class="language-dockerfile"><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">ENTRYPOINT</span> exec top -b</span>
</span></code></pre>
<p>这将使用 shell 处理来替换 shell 变量,并将忽略任何 <code>CMD</code><code>docker run</code> 命令行参数。</p>
</div></div></div><div class="wrap"><div class="wrap-header h3wrap"><h3 id="元数据"><a aria-hidden="true" tabindex="-1" href="#元数据"><span class="icon icon-link"></span></a>元数据</h3><div class="wrap-body">
</div></div></div><div class="wrap"><div class="wrap-header h3wrap"><h3 id="元数据-label"><a aria-hidden="true" tabindex="-1" href="#元数据-label"><span class="icon icon-link"></span></a>元数据 LABEL</h3><div class="wrap-body">
<pre class="language-dockerfile"><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">LABEL</span> version=<span class="token string">"1.0"</span></span>
</span></code></pre>
<pre class="wrap-text "><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">LABEL</span> <span class="token string">"com.example.vendor"</span>=<span class="token string">"ACME Incorporated"</span></span>
@ -110,6 +139,49 @@
</span></span><span class="code-line line-number" line="4"><span class="token instruction"> multi.label2=<span class="token string">"value2"</span> <span class="token operator">\</span>
</span></span><span class="code-line line-number" line="5"><span class="token instruction"> other=<span class="token string">"value3"</span></span>
</span></code></pre>
</div></div></div><div class="wrap"><div class="wrap-header h3wrap"><h3 id="arg"><a aria-hidden="true" tabindex="-1" href="#arg"><span class="icon icon-link"></span></a>ARG</h3><div class="wrap-body">
<pre class="language-dockerfile"><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">ARG</span> &#x3C;name>[=&#x3C;default value>]</span>
</span></code></pre>
<p>指令定义了一个变量,在构建时通过 <code>docker build</code> 命令使用 --build-arg <code>&#x3C;varname>=&#x3C;value></code> 标志将其传递给构建器。</p>
<pre class="language-dockerfile"><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">FROM</span> busybox</span>
</span><span class="code-line line-number" line="2"><span class="token comment"># user1 默认值为 someuser</span>
</span><span class="code-line line-number" line="3"><span class="token instruction"><span class="token keyword">ARG</span> user1=someuser</span>
</span><span class="code-line line-number" line="4"><span class="token instruction"><span class="token keyword">ARG</span> buildno=1</span>
</span></code></pre>
</div></div></div><div class="wrap"><div class="wrap-header h3wrap"><h3 id="dockerignore-文件"><a aria-hidden="true" tabindex="-1" href="#dockerignore-文件"><span class="icon icon-link"></span></a>.dockerignore 文件</h3><div class="wrap-body">
<pre class="language-ignore"><code class="language-ignore code-highlight"><span class="code-line line-number" line="1"><span class="token comment"># 注释说明</span>
</span><span class="code-line line-number" line="2"><span class="token entry string"><span class="token operator">*</span><span class="token punctuation">/</span>temp<span class="token operator">*</span></span>
</span><span class="code-line line-number" line="3"><span class="token entry string"><span class="token operator">*</span><span class="token punctuation">/</span><span class="token operator">*</span><span class="token punctuation">/</span>temp<span class="token operator">*</span></span>
</span><span class="code-line line-number" line="4"><span class="token entry string">temp<span class="token operator">?</span></span>
</span></code></pre>
<hr>
<table>
<thead>
<tr>
<th align="left">:-</th>
<th>-</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><code># comment</code></td>
<td>忽略</td>
</tr>
<tr>
<td align="left"><code>*/temp*</code></td>
<td>在根的任何直接子目录中<br>排除名称以 <code>temp</code> 开头的文件和目录</td>
</tr>
<tr>
<td align="left"><code>*/*/temp*</code></td>
<td>从根以下两级的任何子目录中<br>排除以 <code>temp</code> 开头的文件和目录</td>
</tr>
<tr>
<td align="left"><code>temp?</code></td>
<td>排除根目录中名称为<br><code>temp</code> 的单字符扩展名的文件和目录</td>
</tr>
</tbody>
</table>
<p>如果此文件存在,排除与其中的模式匹配的文件和目录,有利于避免 <code>ADD</code><code>COPY</code> 将敏感文件添加到镜像中。匹配是使用 Go 的 <a href="https://golang.org/pkg/path/filepath#Match">filepath.Match</a> 规则完成的。</p>
</div></div></div><div class="wrap col-span-2"><div class="wrap-header h3wrap"><h3 id="主要命令"><a aria-hidden="true" tabindex="-1" href="#主要命令"><span class="icon icon-link"></span></a>主要命令</h3><div class="wrap-body"><!--rehype:wrap-class=col-span-2 -->
<table>
<thead>
@ -161,7 +233,7 @@
</tr>
</tbody>
</table>
</div></div></div><div class="wrap col-span-3"><div class="wrap-header h3wrap"><h3 id="服务静态网站的最小-docker-镜像"><a aria-hidden="true" tabindex="-1" href="#服务静态网站的最小-docker-镜像"><span class="icon icon-link"></span></a>服务静态网站的最小 Docker 镜像</h3><div class="wrap-body"><!--rehype:wrap-class=col-span-3-->
</div></div></div><div class="wrap col-span-2"><div class="wrap-header h3wrap"><h3 id="服务静态网站的最小-docker-镜像"><a aria-hidden="true" tabindex="-1" href="#服务静态网站的最小-docker-镜像"><span class="icon icon-link"></span></a>服务静态网站的最小 Docker 镜像</h3><div class="wrap-body"><!--rehype:wrap-class=col-span-2-->
<pre class="language-dockerfile"><code class="language-dockerfile code-highlight"><span class="code-line line-number" line="1"><span class="token instruction"><span class="token keyword">FROM</span> lipanski/docker-static-website:latest</span>
</span><span class="code-line line-number" line="2"><span class="token comment"># 使用 .dockerignore 文件来控制图像中的内容!</span>
</span><span class="code-line line-number" line="3"><span class="token comment"># 复制当前目录内容,到容器中</span>
@ -178,6 +250,7 @@
<ul>
<li><a href="https://docs.docker.com/engine/reference/builder/">Dockerfile reference</a> <em>(docker.com)</em></li>
<li><a href="./docker.html">Docker 备忘清单</a> <em>(github.io)</em></li>
<li><a href="https://jaywcjlove.github.io/docker-tutorial">Docker入门学习笔记</a> <em>(github.io)</em></li>
</ul>
</div></div></div></div></div><footer class="footer-wrap"><footer class="max-container">© 2022 Kenny Wang, All rights reserved.</footer></footer></body>