<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Image Build on Bill.Lin&#39;s Notes</title>
		<link>https://xinqilin.github.io/tags/image-build/</link>
		<description>Recent content in Image Build on Bill.Lin&#39;s Notes</description>
		<generator>Hugo</generator>
		<language>zh-tw</language>
		
		
		
		
			<lastBuildDate>Sat, 24 Jul 2021 02:21:13 +0800</lastBuildDate>
		
			<atom:link href="https://xinqilin.github.io/tags/image-build/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Dockerfile 基礎：建構 Docker 映像檔的核心指令</title>
				<link>https://xinqilin.github.io/post/container/dockerfile-basic/</link>
				<pubDate>Sat, 24 Jul 2021 02:21:13 +0800</pubDate>
				<guid>https://xinqilin.github.io/post/container/dockerfile-basic/</guid>
				<description>&lt;h2 id=&#34;概述&#34;&gt;概述&lt;/h2&gt;&#xA;&lt;p&gt;Dockerfile 是一個包含一系列指令的文字檔案，Docker 引擎會讀取這些指令，並自動建構出 Docker 映像檔 (Image)。它定義了映像檔的內容、運行環境以及啟動時執行的指令。理解 Dockerfile 是掌握 Docker 容器化技術的關鍵一步。&lt;/p&gt;&#xA;&lt;h2 id=&#34;dockerfile-核心指令詳解&#34;&gt;Dockerfile 核心指令詳解&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-基礎指令&#34;&gt;1. 基礎指令&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;FROM&lt;/code&gt;：指定基礎映像檔。Dockerfile 的第一條指令必須是 &lt;code&gt;FROM&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;語法&lt;/strong&gt;：&lt;code&gt;FROM &amp;lt;image&amp;gt;[:&amp;lt;tag&amp;gt;]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;範例&lt;/strong&gt;：&lt;code&gt;FROM ubuntu:18.04&lt;/code&gt; (使用 Ubuntu 18.04 作為基礎映像檔)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：如果未指定 &lt;code&gt;tag&lt;/code&gt;，預設為 &lt;code&gt;latest&lt;/code&gt;。建議明確指定版本，以確保建構的可重複性。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;MAINTAINER&lt;/code&gt;：指定映像檔的維護者資訊。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;語法&lt;/strong&gt;：&lt;code&gt;MAINTAINER &amp;lt;name&amp;gt; [email]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;範例&lt;/strong&gt;：&lt;code&gt;MAINTAINER Bill.Lin &amp;lt;zzx123bill@gmail.com&amp;gt;&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：此指令已過時，建議使用 &lt;code&gt;LABEL&lt;/code&gt; 指令來替代，例如 &lt;code&gt;LABEL maintainer=&amp;quot;Bill.Lin &amp;lt;zzx123bill@gmail.com&amp;gt;&amp;quot;&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;2-執行指令&#34;&gt;2. 執行指令&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;RUN&lt;/code&gt;：在建構映像檔時執行命令。每個 &lt;code&gt;RUN&lt;/code&gt; 指令都會在映像檔中建立一個新的層 (layer)。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;語法&lt;/strong&gt;：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;RUN &amp;lt;command&amp;gt;&lt;/code&gt; (shell 模式，預設使用 &lt;code&gt;/bin/sh -c&lt;/code&gt; 執行)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;RUN [&amp;quot;executable&amp;quot;, &amp;quot;param1&amp;quot;, &amp;quot;param2&amp;quot;]&lt;/code&gt; (exec 模式，直接執行可執行檔)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;範例 (shell 模式)&lt;/strong&gt;：&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-dockerfile&#34; data-lang=&#34;dockerfile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;RUN&lt;/span&gt; apt-get update -y &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get install nginx -y&lt;span class=&#34;err&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：使用 &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; 將多個命令串聯起來，可以減少映像檔層數，優化映像檔大小。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;範例 (exec 模式)&lt;/strong&gt;：&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-dockerfile&#34; data-lang=&#34;dockerfile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;RUN&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;./test.php&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;dev&amp;#34;&lt;/span&gt;, &lt;span class=&#34;s2&#34;&gt;&amp;#34;offline&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# 等同於在容器內執行 `./test.php dev offline`&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;CMD&lt;/code&gt;：設定容器啟動時預設執行的命令。如果 &lt;code&gt;docker run&lt;/code&gt; 命令後帶有參數，&lt;code&gt;CMD&lt;/code&gt; 的命令會被覆蓋。一個 Dockerfile 中只能有一個 &lt;code&gt;CMD&lt;/code&gt;，多個 &lt;code&gt;CMD&lt;/code&gt; 只有最後一個生效。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
