# 【上課筆記】【hiskio】Docker 完全實作！結合 3 大語言掌握容器實務應用

##### 上課講義

[Docker 完全實作 – Dropbox Paper](https://paper.dropbox.com/doc/Docker--BaNWxS3HDfry~X6QJb7Ze4plAg-pcGbQoyLtmiPPoIlkkK2r)

---

[![image-1642476831997.png](https://bookstack.treemanou.com/uploads/images/gallery/2022-01/scaled-1680-/0giARnkNtAdZy4q4-image-1642476831997.png)](https://bookstack.treemanou.com/uploads/images/gallery/2022-01/0giARnkNtAdZy4q4-image-1642476831997.png)

nocopy : 存在檔案不覆蓋

# <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Docker 完全實作</span>

# <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">![man teacher](https://paper.dropboxstatic.com/static/img/ace/emoji/1f468-1f3eb.png?version=6.0.0 "man teacher")</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 讓我們先複習一下 Docker 的安裝</span>

## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Windows 上的 Docker 環境建置</span>

<div id="bkmrk-https%3A%2F%2Fdocs.docker."><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://docs.docker.com/desktop/windows/install/","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://docs.docker.com/desktop/windows/install/">[https://docs.docker.com/desktop/windows/install/](https://docs.docker.com/desktop/windows/install/)  
</span></span></div><div id="bkmrk-%E4%BB%80%E9%BA%BC%E6%98%AFwsl%EF%BC%9F">- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">什麼是WSL？</span>

</div><div id="bkmrk-%E9%81%A9%E7%94%A8%E6%96%BC-linux-%E7%9A%84-windows-">- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">適用於 Linux 的 Windows 子系統可讓開發人員執行 GNU/Linux 環境</span> <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z h-lparen">(包括大部分的命令列工具、公用程式和應用程式)，直接在</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> Windows 上執行，不需進行修改，不會造成傳統虛擬機器或 dualboot 設定的額外負荷。 </span>

</div><div id="bkmrk-https%3A%2F%2Fdocs.microso">- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z url">[https://docs.microsoft.com/zh-tw/windows/wsl/about](https://docs.microsoft.com/zh-tw/windows/wsl/about)</span>

</div><div id="bkmrk--0"></div><div id="bkmrk-https%3A%2F%2Fwww.youtube."><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"youtube","url":"https://www.youtube.com/watch?v=lIkxbE_We1I&","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://www.youtube.com/watch?v=lIkxbE_We1I&">[https://www.youtube.com/watch?v=lIkxbE\_We1I&amp;](https://www.youtube.com/watch?v=lIkxbE_We1I&)  
</span></span></div><div id="bkmrk-https%3A%2F%2Fyoutu.be%2Flik"><span class="attrlink url author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z url">[https://youtu.be/lIkxbE\_We1I](https://youtu.be/lIkxbE_We1I)</span></div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Mac 上的 Docker 環境建置</span>

<div id="bkmrk-https%3A%2F%2Fdocs.docker.-0"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://docs.docker.com/desktop/mac/install/","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://docs.docker.com/desktop/mac/install/">[https://docs.docker.com/desktop/mac/install/](https://docs.docker.com/desktop/mac/install/)  
</span></span></div><div id="bkmrk-%E5%A6%82%E6%9E%9C%E6%82%A8%E7%9A%84%E7%AD%86%E9%9B%BB%E6%98%AFapple-m1-%28sil">- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">如果您的筆電是Apple M1</span> <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z h-lparen">(Silicon)</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> CPU的話，請參考此處的安裝方式：</span>

</div><div id="bkmrk-https%3A%2F%2Fdocs.docker.-1">- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z url">[https://docs.docker.com/desktop/mac/apple-silicon/](https://docs.docker.com/desktop/mac/apple-silicon/)</span>

</div><div id="bkmrk--1"></div><div id="bkmrk-apple-m1%E7%9A%84%E9%99%90%E5%88%B6"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">![police car light](https://paper.dropboxstatic.com/static/img/ace/emoji/1f6a8.png?version=6.0.0 "police car light")</span> <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**Apple M1的限制**</span></div>- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">非所有映像檔都可用於 </span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">ARM64</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 架構。可以使用</span> <span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">--platform linux/amd64</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 模擬運行。但 </span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">mysql</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 不適用於 ARM64，不過可以使用 </span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">mariadb</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 解決此問題。</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">模擬Intel的容器可能會有不穩定的狀況出現，除了速度比較慢之外，也會使用更多的記憶體。</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">無法從容器內部 </span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">ping</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 到 Internet。要測試網絡，我們建議使用 </span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">curl</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 或 </span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">wget</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">。</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">當 </span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">TCP half-close</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">時，數據可能偶爾會丟失。</span>

<div id="bkmrk-%C2%A0">- 

</div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Linux 上的 Docker 環境建置</span>

<div id="bkmrk-https%3A%2F%2Fdocs.docker.-2"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://docs.docker.com/engine/install/ubuntu/","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://docs.docker.com/engine/install/ubuntu/">[https://docs.docker.com/engine/install/ubuntu/](https://docs.docker.com/engine/install/ubuntu/)  
</span></span></div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">實務上需要注意的事</span>

<div id="bkmrk--2"></div><div id="bkmrk-%E5%9C%A8%E5%A4%A7%E5%9E%8B%E7%B5%84%E7%B9%94%EF%BC%88%E8%B6%85%E9%81%8E-250-%E5%90%8D%E5%93%A1%E5%B7%A5%E6%88%96%E8%B6%85%E9%81%8E-">- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">![light bulb](https://paper.dropboxstatic.com/static/img/ace/emoji/1f4a1.png?version=6.0.0 "light bulb")</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 在大型組織（超過 250 名員工或超過 1000 萬美元的收入）中使用 Docker Desktop 需要付費訂閱 Docker。 雖然此條款的生效日期是 2021 年 8 月 31 日，但對於需要付費訂閱的用戶，寬限期到 2022 年 1 月 31 日。</span>

</div><div id="bkmrk--3"></div><div id="bkmrk-cpu%2Fmemory%E8%B3%87%E6%BA%90"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**CPU/Memory資源**</span></span></div><div id="bkmrk--5"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"image","url":"https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634205117720_image.png","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634205117720_image.png">![](https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634205117720_image.png)</span></span></div><div id="bkmrk-%E6%8E%9B%E8%BC%89%E7%9B%AE%E9%8C%84"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**掛載目錄**</span></span></div><div id="bkmrk--6"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"image","url":"https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634205302746_image.png","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634205302746_image.png">![](https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634205302746_image.png)</span></span></div><div id="bkmrk-buildkit"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**Buildkit**</span></span></div><div id="bkmrk--7"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"image","url":"https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634205247210_image.png","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634205247210_image.png">![](https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634205247210_image.png)</span></span></div><div id="bkmrk-%E5%9B%9E%E5%BE%A9%E5%88%9D%E5%A7%8B%E8%A8%AD%E5%AE%9A"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**回復初始設定**</span></span></div><div id="bkmrk--8"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"image","url":"https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634207204490_image.png","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634207204490_image.png">![](https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634207204490_image.png)</span></span></div># <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">![whale](https://paper.dropboxstatic.com/static/img/ace/emoji/1f40b.png?version=6.0.0 "whale")</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 工欲善其事，必先利其器：Docker 技術快覽</span>

## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Docker 常用指令 </span>

<div id="bkmrk--9"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"image","url":"https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634184121714_image.png","thread-757518322229675521325990":"false","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"Source: https://docs.google.com/presentation/d/1pBBTzAbKAYTDXDE6ZDZzQkFKzFisMPQB8T96o1-N7po/pub?start=false&loop=false&delayms=3000&slide=id.g19613dd9d0_0_541\n","attribs":"*0+4e|1+1"},"pool":{"numToAttrib":{"0":["author","d.iX86Va0dCNNJDjPG9iZa3ls0ROswnpuOedberDa3xTLqmSmT1K"]},"attribToNum":{"author,d.iX86Va0dCNNJDjPG9iZa3ls0ROswnpuOedberDa3xTLqmSmT1K":0},"nextNum":1,"dirty":true,"firstDirtyNum":0}}}}]}" data-ace-gallery-urls="https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634184121714_image.png">![](https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634184121714_image.png)</span></span></div><div id="bkmrk-%E5%9F%B7%E8%A1%8C%E5%AE%B9%E5%99%A8"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**執行容器**</span></span></div><div id="bkmrk-%23-%E8%B7%91%E4%B8%80%E5%80%8B%E6%96%B0%E7%9A%84apache%E5%AE%B9%E5%99%A8">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># 跑一個新的apache容器</span>`</div><div id="bkmrk-docker-run-httpd%3Aalp">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker run httpd:alpine</span>`</div><div id="bkmrk--10"></div><div id="bkmrk-%23-%E8%B7%91%E4%B8%80%E5%80%8B%E8%83%8C%E6%99%AF%E5%9F%B7%E8%A1%8C%E7%9A%84apache%E5%AE%B9%E5%99%A8%EF%BC%8C%E4%B8%A6">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># 跑一個背景執行的apache容器，並取名為apache</span>`</div><div id="bkmrk-docker-run--d---name">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker run -d --name apache httpd:alpine </span>`</div><div id="bkmrk--11"></div><div id="bkmrk-%23-%E8%B7%91%E4%B8%80%E5%80%8Bredis%E5%AE%B9%E5%99%A8%EF%BC%8C%E5%95%9F%E5%8B%95%E8%99%9B%E6%93%AC%E7%B5%82%E7%AB%AF%E6%A9%9F">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># 跑一個redis容器，啟動虛擬終端機，進入互動模式，在容器中執行sh</span>`</div><div id="bkmrk-docker-run--it---rm-">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker run -it --rm redis:alpine sh</span>`</div>- <span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">-it</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> : </span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">i</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">指的就是互動模式，而 </span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">t</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">就是指terminal的意示</span>
- <span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">--rm</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> :指的是當容器結束後，將容器從系統移除</span>

<div id="bkmrk--12"></div><div id="bkmrk-%E5%88%97%E5%87%BA%E5%AE%B9%E5%99%A8"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**列出容器**</span></span></div><div id="bkmrk-%23-%E5%88%97%E5%87%BA%E6%89%80%E6%9C%89%E5%9F%B7%E8%A1%8C%E4%B8%AD%E5%AE%B9%E5%99%A8">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><em># 列出所有執行中容器</em></span>`</div><div id="bkmrk-docker-ps">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker ps</span>`</div><div id="bkmrk--13"></div><div id="bkmrk-%23-%E5%88%97%E5%87%BA%E6%89%80%E6%9C%89%E5%AE%B9%E5%99%A8">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><em># 列出所有容器</em></span>`</div><div id="bkmrk-docker-ps--a">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker ps -a</span>`</div><div id="bkmrk--14"></div><div id="bkmrk-%E5%81%9C%E6%AD%A2%E5%AE%B9%E5%99%A8"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**停止容器**</span></span></div><div id="bkmrk-%23-%E5%81%9C%E6%AD%A2apache-%E5%AE%B9%E5%99%A8">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># 停止apache 容器</span>`</div><div id="bkmrk-docker-stop-apache">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker stop </span><span class="thread-988202269380550252733434 attrcomment attrcommentfirst thread-988202269380550252733434-first author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="comment-extra-inner-span">apache</span></span>`</div><div id="bkmrk--15"></div><div id="bkmrk-%E9%87%8D%E6%96%B0%E5%95%9F%E5%8B%95%E5%AE%B9%E5%99%A8"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**重新啟動容器**</span></span></div><div id="bkmrk-%23-%E9%87%8D%E6%96%B0%E5%95%9F%E5%8B%95apache">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># 重新啟動apache</span>`</div><div id="bkmrk-docker-restart-apach">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker restart </span><span class="thread-988202269380550252733434 attrcomment attrcommentfirst thread-988202269380550252733434-first author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="comment-extra-inner-span">apache</span></span>`</div><div id="bkmrk--16"></div><div id="bkmrk-kill%E5%AE%B9%E5%99%A8"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**Kill容器**</span></span></div><div id="bkmrk-%23%E5%BC%B7%E5%88%B6%E5%81%9C%E6%AD%A2%E5%AE%B9%E5%99%A8">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#強制停止容器</span>`</div><div id="bkmrk-docker-kill-apache">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker kill apache</span>`</div><div id="bkmrk--17"></div><div id="bkmrk-%E7%A7%BB%E9%99%A4%E5%AE%B9%E5%99%A8"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**移除容器**</span></span></div><div id="bkmrk-%23%E7%A7%BB%E9%99%A4apache">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#移除apache</span>`</div><div id="bkmrk-docker-rm-apache">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker rm apache</span>`</div><div id="bkmrk-%23%E6%AA%A2%E6%9F%A5%E6%89%80%E6%9C%89%E5%AE%B9%E5%99%A8">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#檢查所有容器</span>`</div><div id="bkmrk-docker-ps--a-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker ps -a</span>`</div><div id="bkmrk-%23%E7%A7%BB%E9%99%A4%E6%89%80%E6%9C%89%E5%AE%B9%E5%99%A8">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#移除所有容器</span>`</div><div id="bkmrk-docker-rm--f-%24%28docke">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker rm -f $(docker ps -a -q)</span>`</div><div id="bkmrk--18"></div><div id="bkmrk-%E8%A4%87%E8%A3%BD%E6%AA%94%E6%A1%88"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**複製檔案**</span></span></div><div id="bkmrk-%23-%E5%BB%BA%E7%AB%8B%E4%B8%80%E5%80%8Bhello.html">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># 建立一個hello.html</span>`</div><div id="bkmrk-echo-%22hello%22-%3E-hello">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">echo "hello" > hello.html</span>`</div><div id="bkmrk-%23-%E5%BB%BA%E7%AB%8Bapache">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># 建立apache</span>`</div><div id="bkmrk-docker-run--d---name-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker run -d --name apache httpd:alpine </span>`</div><div id="bkmrk-%23-%E8%A4%87%E8%A3%BD%E6%AA%94%E6%A1%88%E8%87%B3apache-%E5%AE%B9%E5%99%A8%E4%B8%AD">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># 複製檔案至apache 容器中</span>`</div><div id="bkmrk-docker-cp-hello.html">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker cp hello.html apache:/usr/local/apache2/htdocs/</span>`</div><div id="bkmrk-%23-%E8%A4%87%E8%A3%BDapache-%E5%AE%B9%E5%99%A8%E4%B8%AD%E7%9A%84%E6%AA%94%E6%A1%88%E8%87%B3%E6%9C%AC%E6%A9%9F">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># 複製apache 容器中的檔案至本機</span>`</div><div id="bkmrk-docker-cp-apache%3A%2Fus">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker cp apache:/usr/local/apache2/htdocs/index.html ./index.html</span>`</div><div id="bkmrk--19"></div><div id="bkmrk-%E5%9C%A8%E5%AE%B9%E5%99%A8%E5%85%A7%E5%9F%B7%E8%A1%8C%E7%A8%8B%E5%BC%8F"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**在容器內執行程式**</span></span></div><div id="bkmrk-%23%E5%9C%A8%E5%AE%B9%E5%99%A8%E4%B8%AD%E5%9F%B7%E8%A1%8Cshell">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#在容器中執行shell</span>`</div><div id="bkmrk-docker-exec--it-apac">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker exec -it apache sh</span>`</div><div id="bkmrk--20"></div><div id="bkmrk-%E6%8E%9B%E8%BC%89%E7%9B%AE%E9%8C%84-0"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**掛載目錄**</span></span></div><div id="bkmrk-%23%E6%8A%8Ahello.html%E6%8E%9B%E6%88%90index.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#把hello.html掛成index.html</span>`</div><div id="bkmrk-docker-run--d---name-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker run -d --name apache2 -v $PWD/hello.html:/usr/local/apache2/htdocs/index.html httpd:alpine</span>`</div><div id="bkmrk-%23-copy%E5%87%BA%E4%BE%86%E9%A9%97%E8%AD%89%E5%85%A7%E5%AE%B9%E6%98%AF%E5%90%A6%E4%B8%80%E6%A8%A3">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># copy出來驗證內容是否一樣</span>`</div><div id="bkmrk-docker-cp-apache2%3A%2Fu">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker cp apache2:/usr/local/apache2/htdocs/index.html ./index.html</span>`</div><div id="bkmrk-diff-index.html-hell">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">diff index.html hello.html</span>`</div><div id="bkmrk--21"></div><div id="bkmrk-%E5%BB%BA%E7%AB%8B%E5%A4%96%E9%83%A8%E9%80%A3%E7%B7%9A"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**建立外部連線**</span></span></div><div id="bkmrk-%23%E6%8A%8A%E3%80%8C%E6%9C%AC%E6%A9%9F%E7%9A%8480%E5%9F%A0%E3%80%8D%E5%B0%8D%E6%87%89%E5%88%B0%E3%80%8C%E5%AE%B9%E5%99%A8%E4%B8%AD%E7%9A%8480">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#把「本機的80埠」對應到「容器中的80埠」</span>`</div><div id="bkmrk-docker-run--d--v-%24pw">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker run -d -v $PWD/hello.html:/usr/local/apache2/htdocs/index.html -p 80:80 httpd:alpine</span>`</div><div id="bkmrk-http%3A%2F%2F127.0.0.1%3A80"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z url">[http://127.0.0.1:80](http://127.0.0.1:80)</span></div><div id="bkmrk--22"></div><div id="bkmrk-%E5%A6%82%E4%BD%95%E5%BE%9E%E5%AE%B9%E5%99%A8%E4%B8%AD%EF%BC%8C%E9%80%A3%E5%88%B0%E6%9C%AC%E6%A9%9F%E4%B8%8A%E7%9A%84%E6%9C%8D%E5%8B%99%E5%91%A2%EF%BC%9F">- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">![light bulb](https://paper.dropboxstatic.com/static/img/ace/emoji/1f4a1.png?version=6.0.0 "light bulb")</span> <span class="attrlink url author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">[如何從容器中，連到本機上的服務呢](https://stackoverflow.com/questions/24319662/from-inside-of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach)</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">？</span>

</div><div id="bkmrk-%E5%8F%AF%E4%BB%A5%E5%9C%A8%E5%AE%B9%E5%99%A8%E4%B8%AD%E4%BD%BF%E7%94%A8-host.docker">- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">可以在容器中使用 </span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">host.docker.internal</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 來連接本機上的服務喔！</span>

</div><div id="bkmrk--23"></div><div id="bkmrk--24"></div><div id="bkmrk-%E6%9F%A5%E7%9C%8B%E5%AE%B9%E5%99%A8%E7%8B%80%E6%85%8B"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**查看容器狀態**</span></span></div><div id="bkmrk-%23-%E6%9F%A5%E7%9C%8B-cpu%E3%80%81%E8%A8%98%E6%86%B6%E9%AB%94%E8%88%87%E7%B6%B2%E8%B7%AF%E7%94%A8%E9%87%8F">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><em># 查看 CPU、記憶體與網路用量</em></span>`</div><div id="bkmrk-docker-stats">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker stats</span>`</div><div id="bkmrk--25"></div><div id="bkmrk-%E6%9F%A5%E7%9C%8B%E5%AE%B9%E5%99%A8%E5%85%A7%E7%9A%84%E8%A1%8C%E7%A8%8B"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**查看容器內的行程**</span></span></div><div id="bkmrk-%23-%E6%9F%A5%E7%9C%8B%E5%AE%B9%E5%99%A8%E5%85%A7%E9%83%A8%E7%9A%84%E8%A1%8C%E7%A8%8B">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><em># 查看容器內部的行程</em></span>`</div><div id="bkmrk-docker-top-apache">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker top apache</span>`</div><div id="bkmrk-docker-top-apache2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker top apache2</span>`</div><div id="bkmrk--26"></div><div id="bkmrk-%E6%9F%A5%E7%9C%8B%E5%AE%B9%E5%99%A8logs"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**查看容器Logs**</span></span></div><div id="bkmrk-%23%E6%9F%A5%E7%9C%8Blog">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#查看log</span>`</div><div id="bkmrk-docker-logs-apache">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker logs apache</span>`</div><div id="bkmrk-%23%E6%8C%81%E7%BA%8C%E6%9F%A5%E7%9C%8B">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#持續查看</span>`</div><div id="bkmrk-docker-logs--f-apach">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker logs -f apache2</span>`</div><div id="bkmrk--27"></div><div id="bkmrk-%E5%BB%BA%E7%AB%8B%E6%98%A0%E5%83%8F%E6%AA%94"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**建立映像檔**</span></span></div><div id="bkmrk-%23-%E6%96%BC%E7%95%B6%E5%89%8D%E7%9B%AE%E9%8C%84%EF%BC%8C%E6%8C%89dockerfile.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># 於當前目錄，按Dockerfile.test中的指令，建立test:v1的映像檔</span>`</div><div id="bkmrk-docker-build-.--f-do">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker build . -f Dockerfile.test -t test:v1</span>`</div><div id="bkmrk--28"></div><div id="bkmrk-%E6%8B%89%E5%8F%96%E8%88%87%E6%8E%A8%E9%80%81%E6%98%A0%E5%83%8F%E6%AA%94"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**拉取與推送映像檔**</span></span></div><div id="bkmrk-%23%E5%BE%9Edocker-hub%E4%B8%8B%E8%BC%89-node%E7%9A%84">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#從docker hub下載 node的image</span>`</div><div id="bkmrk-docker-pull-node%3Aalp">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker pull node:alpine</span>`</div><div id="bkmrk-%23%E5%B0%87%E4%B8%8B%E4%BE%86%E7%9A%84image%EF%BC%8C%E5%86%8D%E7%B5%A6%E6%96%BC%E6%96%B0%E7%9A%84%E6%A8%99%E7%B1%A4">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#將下來的image，再給於新的標籤</span>`</div><div id="bkmrk-docker-tag-node%3Aalpi">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker tag node:alpine macchiang/node:alpine</span>`</div><div id="bkmrk-%23%E6%8E%A8%E9%80%81%E6%96%B0%E7%9A%84%E6%A8%99%E7%B1%A4%E8%87%B3%E7%A7%81%E4%BA%BA%E5%80%89%E5%BA%AB">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#推送新的標籤至私人倉庫</span>`</div><div id="bkmrk-docker-push-macchian">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker push macchiang/node:alpine</span>`</div><div id="bkmrk--29"></div><div id="bkmrk-%E6%B8%85%E9%99%A4%E6%98%A0%E5%83%8F%E6%AA%94%E8%88%87%E5%AE%B9%E5%99%A8"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**清除映像檔與容器**</span></span></div><div id="bkmrk-%23%E5%81%9C%E6%8E%89%E5%85%A8%E9%83%A8container">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#停掉全部container</span>`</div><div id="bkmrk-docker-stop-%24%28docker">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker stop $(docker ps -a -q)</span>`</div><div id="bkmrk-%23%E5%88%AA%E9%99%A4%E6%89%80%E6%9C%89%E6%B2%92%E6%9C%89%E4%BD%BF%E7%94%A8%E7%9A%84container%E8%88%87">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#刪除所有沒有使用的container與image</span>`</div><div id="bkmrk-docker-system-prune">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker system prune</span>`</div><div id="bkmrk-%23%E5%88%AA%E9%99%A4%E6%89%80%E6%9C%89%E6%98%A0%E5%83%8F%E6%AA%94">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#刪除所有映像檔</span>`</div><div id="bkmrk-docker-rmi-%24%28docker-">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker rmi $(docker images -a -q)</span>`</div><div id="bkmrk-%23%E6%B8%85%E9%99%A4volume">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#清除volume</span>`</div><div id="bkmrk-docker-volume-rm-%24%28d">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker volume rm $(docker volume ls)</span>`</div><div id="bkmrk--30"></div><div id="bkmrk-%23%E5%88%AA%E9%99%A4%E6%89%80%E6%9C%89%E6%B2%92%E6%9C%89%E4%BD%BF%E7%94%A8%E7%9A%84container%E3%80%81">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#刪除所有沒有使用的container、image及所有volume</span>`</div><div id="bkmrk-docker-system-prune-">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker system prune -a -f --volumes</span>`</div><div id="bkmrk--31"></div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Dockerfile 起手式</span>

<div id="bkmrk-%E5%9F%BA%E6%9C%AC%E7%B5%84%E6%88%90"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**基本組成**</span></span></div><div id="bkmrk-%23-base-image---offic">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><em># Base Image - Official Alpine</em></span>`</div><div id="bkmrk-from-alpine">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>FROM</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> alpine</span>`</div><div id="bkmrk-%C2%A0-0">` `</div><div id="bkmrk-label-%22maintainer%22%3D%22">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>LABEL</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> "maintainer"="macchiang@gmail.com"</span>`</div><div id="bkmrk-%C2%A0-1">` `</div><div id="bkmrk-%23-upgrade-existing-p">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><em># Upgrade existing packages in the base image</em></span>`</div><div id="bkmrk-run-apk---no-cache-u">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>RUN</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> apk </span><span class="highlight author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z" data-highlight-color="#FFBFB5">--no-cache</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> upgrade</span>`</div><div id="bkmrk-%C2%A0-2">` `</div><div id="bkmrk-%23-install-apache-fro">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><em># Install apache from packages with out caching install files</em></span>`</div><div id="bkmrk-run-apk-add---no-cac">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>RUN</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> apk add --no-cache apache2</span>`</div><div id="bkmrk-%C2%A0-3">` `</div><div id="bkmrk-%23-open-port-for-http">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><em># Open port for httpd access</em></span>`</div><div id="bkmrk-expose-80">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>EXPOSE</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 80</span>`</div><div id="bkmrk-%C2%A0-6">` `</div><div id="bkmrk-%23-run-httpd-in-foreg">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><em># Run httpd in foreground</em></span>`</div><div id="bkmrk-cmd-%5B%22-d%22%2C%22foregroun">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>CMD</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> ["-D","FOREGROUND"]</span>`</div><div id="bkmrk-%C2%A0-7">` `</div><div id="bkmrk-%23-start-httpd-when-c">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><em># Start httpd when container runs</em></span>`</div><div id="bkmrk-entrypoint-%5B%22%2Fusr%2Fsb">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>ENTRYPOINT</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> ["/usr/sbin/httpd"]</span>`</div><div id="bkmrk--32"></div><div id="bkmrk-%C2%A0cmd-vs.-entrypoint">- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">![light bulb](https://paper.dropboxstatic.com/static/img/ace/emoji/1f4a1.png?version=6.0.0 "light bulb")</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> </span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**CMD**</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> vs. </span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**ENTRYPOINT**</span>

</div><div id="bkmrk-cmd%E9%85%8D%E7%BD%AE%E7%9A%84%E6%98%AF%E9%A0%90%E8%A8%AD%E5%91%BD%E4%BB%A4%EF%BC%8C%E6%98%AF%E5%8F%AF%E4%BB%A5%E8%A2%AB%E8%A4%87%E5%AF%AB%E6%8E%89%E7%9A%84">- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">CMD配置的是預設命令，是可以被複寫掉的。而ENTRYPOINT是一定會執行的命令。</span>

</div><div id="bkmrk-%E5%85%A9%E8%80%85%E5%85%B1%E7%94%A8%E7%9A%84%E8%A9%B1%EF%BC%8C%E5%AE%8C%E6%95%B4%E7%9A%84%E5%91%BD%E4%BB%A4%E6%9C%83%E6%98%AFentryp">- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">兩者共用的話，完整的命令會是</span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">ENTRYPOINT + CMD</span>

</div><div id="bkmrk--33"></div><div id="bkmrk-%E5%BB%BA%E7%AB%8Bdocker-image"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">建立docker image</span></div><div id="bkmrk-docker-build-.--t-ap">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker build . -t apache:v1</span>`</div><div id="bkmrk--34"></div><div id="bkmrk-%E8%A4%87%E5%AF%ABcmd"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">複寫CMD</span></div><div id="bkmrk-%23%E7%9B%B4%E6%8E%A5%E8%A4%87%E5%AF%ABcmd%EF%BC%8C%E6%94%B9%E7%82%BA%E9%A1%AF%E7%A4%BA%E7%89%88%E8%99%9F">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#直接複寫CMD，改為顯示版號</span>`</div><div id="bkmrk-docker-run---rm-apac">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker run --rm apache:v1 -v</span>`</div><div id="bkmrk--35"></div><div id="bkmrk-env%E7%92%B0%E5%A2%83%E8%AE%8A%E6%95%B8"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**ENV環境變數**</span></span></div><div id="bkmrk-from-alpine-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>FROM</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> alpine</span>`</div><div id="bkmrk-env-node_env%3D%22develo">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>ENV</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> NODE_ENV="development"</span>`</div><div id="bkmrk--36"></div><div id="bkmrk-arg%E5%82%B3%E5%85%A5%E5%8F%83%E6%95%B8"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**ARG傳入參數**</span></span></div><div id="bkmrk-from-alpine-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>FROM</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> alpine</span>`</div><div id="bkmrk-arg-node_arg">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>ARG </strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">NODE_ARG</span>`</div><div id="bkmrk-env-node_env%3D%22%24%7Bnode">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>ENV</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> NODE_ENV="${NODE_ARG:-development}"</span>`</div><div id="bkmrk-run-echo-%22arg%3D%24%7Bnode">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>RUN</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> echo "ARG=${NODE_ARG}, ENV=${NODE_ENV}"</span>`</div><div id="bkmrk-cmd-echo-%22arg%3D%24%7Bnode">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>CMD</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> echo "ARG=${NODE_ARG}, ENV=${NODE_ENV}"</span>`</div><div id="bkmrk--37"></div><div id="bkmrk-%23-%E5%82%B3%E5%85%A5node_arg">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># 傳入NODE_ARG</span>`</div><div id="bkmrk-docker_buildkit%3D0-do">`<span class="thread-263389414338883775841008 attrcomment attrcommentfirst thread-263389414338883775841008-first author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="comment-extra-inner-span">DOCKER_BUILDKIT=0 </span></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker build --build-arg NODE_ARG=staging .</span>`</div><div id="bkmrk--38"></div><div id="bkmrk-%23-%E5%82%B3%E5%85%A5node_arg-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># 傳入NODE_ARG</span>`</div><div id="bkmrk-docker_buildkit%3D0-do-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">DOCKER_BUILDKIT=0 docker build .</span>`</div><div id="bkmrk--39"></div><div id="bkmrk-copy%E8%88%87add-%E8%A4%87%E8%A3%BD%E6%96%87%E4%BB%B6"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**COPY與ADD 複製文件**</span></span></div><div id="bkmrk-%E5%8A%9F%E8%83%BD%EF%BC%9A%E5%B0%87%E6%AA%94%E6%A1%88%E8%A4%87%E8%A3%BD%E5%88%B0image%E4%B8%AD">- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">功能：將檔案複製到image中</span>

</div><div id="bkmrk-%E5%B7%AE%E7%95%B0%EF%BC%9A">- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">差異：</span>

</div>- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY只能複製本機端的檔案或目錄</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">ADD可增加url的檔案到docker image</span> <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z h-lparen">(建議改用RUN</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> curl/wget)</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">ADD可將本機端認可的壓縮格式tar解開後複製進去(要小心)</span>



<div id="bkmrk-%E6%9C%80%E4%BD%B3%E5%AF%A6%E8%B8%90%EF%BC%9A-%E7%9B%A1%E9%87%8F%E4%BD%BF%E7%94%A8copy%E8%80%8C%E4%B8%8D%E6%98%AFadd">- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">最佳實踐： 盡量使用</span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">而不是</span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">ADD</span>

</div><div id="bkmrk--40"></div><div id="bkmrk-%23%E8%A4%87%E8%A3%BDpackage.json%E5%88%B0%2Fapp">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#複製package.json到/app下</span>`</div><div id="bkmrk-copy-package.json-%2Fa">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY package.json /app/</span>`</div><div id="bkmrk--41"></div><div id="bkmrk-%23%E8%A4%87%E8%A3%BD%E6%89%80%E6%9C%89file%E9%96%8B%E9%A0%AD%E7%9A%84%E6%AA%94%E6%A1%88%E5%88%B0%2Fapp%E4%B8%8B">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#複製所有file開頭的檔案到/app下，並改變檔案所屬用戶與群組</span>`</div><div id="bkmrk-copy---chown%3Duser%3Agr">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY --chown=user</span><span class="thread-664457574932181552801007 author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">:group</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> file* /app/</span>`</div><div id="bkmrk--42"></div><div id="bkmrk-%E8%8B%A5%E6%9C%89%E4%BA%9B%E6%AA%94%E6%A1%88%E4%B8%8D%E9%9C%80%E8%A6%81%E5%8A%A0%E5%85%A5%E5%88%B0image%E4%B8%AD%EF%BC%8C-%E5%8F%AF">- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">![light bulb](https://paper.dropboxstatic.com/static/img/ace/emoji/1f4a1.png?version=6.0.0 "light bulb")</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 若有些檔案不需要加入到image中， 可以建立 </span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">.dockerignore</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 來忽略喔！</span>

</div><div id="bkmrk--43"></div><div id="bkmrk-workdir%E5%B7%A5%E4%BD%9C%E7%9B%AE%E9%8C%84"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**WORKDIR工作目錄**</span></span></div><div id="bkmrk-%23-hi.txt%E6%9C%83%E5%9C%A8%2F%E7%9B%AE%E9%8C%84%E4%B8%8B">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># hi.txt會在/目錄下</span>`</div><div id="bkmrk-run-echo-%22say-hi%22-%3E-">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN echo "say hi" > hi.txt</span>`</div><div id="bkmrk-workdir-%2Fapp">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">WORKDIR /app</span>`</div><div id="bkmrk-%23-world.txt%E6%9C%83%E5%9C%A8%2Fapp%E7%9A%84%E7%9B%AE%E9%8C%84">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># world.txt會在/app的目錄下</span>`</div><div id="bkmrk-run-echo-%22hello%22-%3E-w">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN echo "hello" > world.txt</span>`</div><div id="bkmrk--44"></div><div id="bkmrk-user%E6%8C%87%E5%AE%9A%E7%95%B6%E5%89%8D%E7%94%A8%E6%88%B6"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**USER指定當前用戶**</span></span></div><div id="bkmrk-%23%E6%96%B0%E5%A2%9Egroup%E8%88%87user">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#新增group與user</span>`</div><div id="bkmrk-run-groupadd--r-redi">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN groupadd -r redis && useradd -r -g redis redis</span>`</div><div id="bkmrk-%23%E6%8C%87%E5%AE%9A%E7%95%B6%E5%89%8D%E7%9A%84user%E7%82%BAredis">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#指定當前的user為redis</span>`</div><div id="bkmrk-user-redis">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">USER redis</span>`</div><div id="bkmrk-%23%E4%BB%A5redis%E7%9A%84%E8%BA%AB%E4%BB%BD%E5%9F%B7%E8%A1%8Credis-se">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#以redis的身份執行redis-server</span>`</div><div id="bkmrk-run-%5B-%22redis-server%22">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN [ "redis-server" ]</span>`</div><div id="bkmrk--45"></div><div id="bkmrk-healthcheck-%E5%81%A5%E5%BA%B7%E6%AA%A2%E6%9F%A5"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**HEALTHCHECK 健康檢查**</span></span></div><div id="bkmrk-from-nginx">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">FROM nginx</span>`</div><div id="bkmrk-run-apt-get-update-%26">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN apt-get update && apt-get install -y curl && </span><span class="thread-590770326760184689811544 attrcomment attrcommentfirst thread-590770326760184689811544-first author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="comment-extra-inner-span">rm -rf /var/lib/apt/lists/*</span></span>`</div><div id="bkmrk-healthcheck---interv">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">HEALTHCHECK --interval=5s --timeout=3s \</span>`</div><div id="bkmrk-%C2%A0-cmd-curl--fs-http%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  CMD curl -fs http://localhost/ || exit 1</span>`</div><div id="bkmrk--46"></div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">打造最小的Docker映像檔 </span>

<div id="bkmrk-%E5%A4%9A%E9%9A%8E%E6%AE%B5%E5%BB%BA%E7%BD%AEmulti-stage-bui"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**多階段建置Multi-stage Build**</span></span></div><div id="bkmrk-%23-stage-1-%E5%BB%BA%E7%BD%AE%E7%92%B0%E5%A2%83">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># Stage 1 建置環境</span>`</div><div id="bkmrk-from-alpine-as-build">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">FROM alpine </span><span class="thread-327434999775899771653400 attrcomment attrcommentfirst thread-327434999775899771653400-first author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="comment-extra-inner-span">AS</span></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> build</span>`</div><div id="bkmrk-run-echo-%22hello%22-%3E-m">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN echo "hello" > mytest</span>`</div><div id="bkmrk-%C2%A0-8">` `</div><div id="bkmrk-%23-stage-2-%E5%9F%B7%E8%A1%8C%E7%92%B0%E5%A2%83">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># Stage 2 執行環境</span>`</div><div id="bkmrk-from-alpine-%C2%A0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">FROM alpine  </span>`</div><div id="bkmrk-copy---from%3Dbuild-%2Fm">`<span class="thread-181959338896635756049539 attrcomment attrcommentfirst thread-181959338896635756049539-first author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="comment-extra-inner-span">COPY --from=build</span></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> /mytest .</span>`</div><div id="bkmrk-run-cat-%2Fmytest">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN cat /mytest</span>`</div><div id="bkmrk--47"></div><div id="bkmrk--48"></div><div id="bkmrk-distroless"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**Distroless**</span></span></div><div id="bkmrk-https%3A%2F%2Fgithub.com%2Fg"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://github.com/GoogleContainerTools/distroless","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://github.com/GoogleContainerTools/distroless">[https://github.com/GoogleContainerTools/distroless](https://github.com/GoogleContainerTools/distroless)  
</span></span></div><div id="bkmrk-https%3A%2F%2Fgithub.com%2Fg-0"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://github.com/GoogleContainerTools/distroless/tree/main/examples/go","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://github.com/GoogleContainerTools/distroless/tree/main/examples/go">[https://github.com/GoogleContainerTools/distroless/tree/main/examples/go](https://github.com/GoogleContainerTools/distroless/tree/main/examples/go)  
</span></span></div><div id="bkmrk-main.go"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">main.go</span></div><div id="bkmrk-package-main">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">package main</span>`</div><div id="bkmrk-%C2%A0-9">` `</div><div id="bkmrk-import-%22fmt%22">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">import "fmt"</span>`</div><div id="bkmrk-%C2%A0-10">` `</div><div id="bkmrk-func-main%28%29-%7B">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">func main() {</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-fmt.println%28">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        fmt.Println("Hello, world!")</span>`</div><div id="bkmrk-%7D">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">}</span>`</div><div id="bkmrk--49"></div><div id="bkmrk-dockerfile"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Dockerfile</span></div><div id="bkmrk-from-golang%3A1.12-as-">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">FROM golang:1.12 as build-env</span>`</div><div id="bkmrk-workdir-%2Fgo%2Fsrc%2Fapp">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">WORKDIR /go/src/app</span>`</div><div id="bkmrk-copy-.-%2Fgo%2Fsrc%2Fapp">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY . /go/src/app</span>`</div><div id="bkmrk-run-go-get--d--v-.%2F.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN go get -d -v ./...</span>`</div><div id="bkmrk-run-go-build--o-%2Fgo%2F">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN go build -o /go/bin/app</span>`</div><div id="bkmrk-%C2%A0-11">` `</div><div id="bkmrk-from-gcr.io%2Fdistrole">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">FROM gcr.io/distroless/base</span>`</div><div id="bkmrk-copy---from%3Dbuild-en">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY --from=build-env /go/bin/app /</span>`</div><div id="bkmrk-cmd-%5B%22%2Fapp%22%5D">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">CMD ["/app"]</span>`</div><div id="bkmrk--50"></div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">建立多重系統架構的映像檔</span>

<div id="bkmrk-%E4%B8%8D%E5%90%8C%E5%9F%B7%E8%A1%8C%E7%92%B0%E5%A2%83%E7%9A%84%E5%95%8F%E9%A1%8C"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**不同執行環境的問題**</span></span></div><div id="bkmrk--51"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"image","url":"https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634268176860_image.png","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"在Apple M1上執行\n","attribs":"*0+c|1+1"},"pool":{"numToAttrib":{"0":["author","d.iX86Va0dCNNJDjPG9iZa3ls0ROswnpuOedberDa3xTLqmSmT1K"]},"attribToNum":{"author,d.iX86Va0dCNNJDjPG9iZa3ls0ROswnpuOedberDa3xTLqmSmT1K":0},"nextNum":1,"dirty":true,"firstDirtyNum":0}}}}]}" data-ace-gallery-urls="https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634268176860_image.png">![](https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634268176860_image.png)</span></span></div><div id="bkmrk-%E4%BD%BF%E7%94%A8buildx%E5%BB%BA%E6%A7%8B%E5%A4%9A%E9%87%8D%E7%B3%BB%E7%B5%B1%E6%9E%B6%E6%A7%8B%E7%9A%84%E6%98%A0%E5%83%8F%E6%AA%94"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**使用Buildx建構多重系統架構的映像檔**</span></span></div><div id="bkmrk-https%3A%2F%2Fdocs.docker.-3"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://docs.docker.com/desktop/multi-arch/","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://docs.docker.com/desktop/multi-arch/">[https://docs.docker.com/desktop/multi-arch/](https://docs.docker.com/desktop/multi-arch/)  
</span></span></div><div id="bkmrk--52"></div><div id="bkmrk-%23%E7%A2%BA%E8%AA%8D%E7%9B%AE%E5%89%8D%E7%9A%84builder%E7%82%BA%E4%BD%95">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#確認目前的builder為何</span>`</div><div id="bkmrk-docker-buildx-ls">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker buildx ls</span>`</div><div id="bkmrk--53"></div><div id="bkmrk-%23%E5%BB%BA%E7%AB%8B%E6%96%B0%E7%9A%84builder%E4%B8%A6%E5%88%87%E6%8F%9B%E9%81%8E%E5%8E%BB">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#建立新的builder並切換過去</span>`</div><div id="bkmrk-docker-buildx-create">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker buildx create --name multiarch --use</span>`</div><div id="bkmrk--54"></div><div id="bkmrk-%E8%8B%A5%E5%9C%A8linux%E7%92%B0%E5%A2%83%E4%B8%AD%E5%BB%BA%E7%AB%8Bbuilder%E7%9A%84"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">![light bulb](https://paper.dropboxstatic.com/static/img/ace/emoji/1f4a1.png?version=6.0.0 "light bulb")</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 若在linux環境中建立builder的話，需要額外跑qemu-user-static容器，並將driver設為docker-container</span></div><div id="bkmrk-docker-run---rm---pr">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker run --rm --privileged multiarch/qemu-user-static --reset -p yes</span>`</div><div id="bkmrk-docker-buildx-create-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker buildx create --name multiarch --driver docker-container --use</span>`</div><div id="bkmrk--55"></div><div id="bkmrk-%23%E6%AA%A2%E6%9F%A5%E7%9B%AE%E5%89%8D%E7%9A%84builder">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#檢查目前的builder</span>`</div><div id="bkmrk-docker-buildx-inspec">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker buildx inspect --bootstrap</span>`</div><div id="bkmrk-%23%E5%BB%BA%E7%AB%8B%E6%94%AF%E6%8F%B4amd64%E8%88%87arm64%E7%9A%84ima">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#建立支援amd64與arm64的image，並且推送至registry</span>`</div><div id="bkmrk-docker-buildx-build-">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker buildx build . --platform linux/amd64,linux/arm64 --push -t hello:v1</span>`</div># <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">![orangutan](https://paper.dropboxstatic.com/static/img/ace/emoji/1f9a7.png?version=6.0.0 "orangutan")</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 一次控制多個容器：Docker Compose</span>

## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Docker Compose 的概念</span>

- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">定義和運行多個容器應用。</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">使用 YAML 文件來配置應用服務</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">使用單一命令從配置中創建和啟動所有服務</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">適用於所有環境：生產、Staging、開發、測試以及 CI 工作流</span>

<div id="bkmrk--56"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"image","url":"https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634196692841_image.png","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"Source: https://share.zabbix.com/virtualization/docker/docker-compose-yml-v2-format-for-zabbix-3-0\n","attribs":"*0+2q|1+1"},"pool":{"numToAttrib":{"0":["author","d.iX86Va0dCNNJDjPG9iZa3ls0ROswnpuOedberDa3xTLqmSmT1K"]},"attribToNum":{"author,d.iX86Va0dCNNJDjPG9iZa3ls0ROswnpuOedberDa3xTLqmSmT1K":0},"nextNum":1,"dirty":true,"firstDirtyNum":0}}}}]}" data-ace-gallery-urls="https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634196692841_image.png">![](https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634196692841_image.png)</span></span></div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Docker Compose 文件格式</span>

<div id="bkmrk-%E5%9F%BA%E6%9C%AC%E6%A0%BC%E5%BC%8F"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**基本格式**</span></span></div><div id="bkmrk-%E9%A0%90%E8%A8%AD%E6%96%87%E4%BB%B6%E5%90%8D%E7%A8%B1%E7%82%BA-docker-compo"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">預設文件名稱為 </span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker-compose.yml</span></div><div id="bkmrk-version%3A-%223%22">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">version: "3"</span>`</div><div id="bkmrk-services%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">services:</span>`</div><div id="bkmrk-%C2%A0-webapp%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  webapp:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%23%E6%8C%87%E5%AE%9Aimage">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    #指定image</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-image%3A-httpd%3Aalp">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    image: httpd:alpine </span>`</div><div id="bkmrk-%C2%A0-%C2%A0-ports%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    ports:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---%2280%3A80%22">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - "80:80"</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-volumes%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    volumes:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---%22%2Fdata%22">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - "/data"</span>`</div><div id="bkmrk--57"></div><div id="bkmrk-build-%E5%BB%BA%E7%AB%8B%E6%98%A0%E5%83%8F%E6%AA%94"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**build 建立映像檔**</span></span></div><div id="bkmrk-version%3A-%273%27">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">version: '3'</span>`</div><div id="bkmrk-services%3A-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">services:</span>`</div><div id="bkmrk-%C2%A0-webapp%3A-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  webapp:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%23%E5%BE%9Edockerfile-alt">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    #從Dockerfile-alternate建立映像檔</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-build%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    build:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-context%3A-.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      context: .</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-dockerfile%3A-do">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      dockerfile: Dockerfile-alternate</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-args%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      args:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-buildno%3A-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        buildno: 1</span>`</div><div id="bkmrk--58"></div><div id="bkmrk-https%3A%2F%2Fdocs.microso-0"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z url">[https://docs.microsoft.com/zh-tw/visualstudio/docker/tutorials/use-docker-compose](https://docs.microsoft.com/zh-tw/visualstudio/docker/tutorials/use-docker-compose)</span></div><div id="bkmrk--59"></div><div id="bkmrk-https%3A%2F%2Fdocs.docker.-4"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://docs.docker.com/compose/compose-file/compose-file-v3/","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://docs.docker.com/compose/compose-file/compose-file-v3/">[https://docs.docker.com/compose/compose-file/compose-file-v3/](https://docs.docker.com/compose/compose-file/compose-file-v3/)  
</span></span></div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Docker Compose 命令參考</span>

<div id="bkmrk-https%3A%2F%2Fdocs.docker.-5"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://docs.docker.com/compose/reference/","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://docs.docker.com/compose/reference/">[https://docs.docker.com/compose/reference/](https://docs.docker.com/compose/reference/)  
</span></span></div><div id="bkmrk-%E5%9F%B7%E8%A1%8Cdocker-compose"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**執行docker compose**</span></span></div><div id="bkmrk-%23%E5%89%8D%E6%99%AF%E5%9F%B7%E8%A1%8C">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#前景執行</span>`</div><div id="bkmrk-docker-compose-up">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker-compose up</span>`</div><div id="bkmrk-%23%E8%83%8C%E6%99%AF%E5%9F%B7%E8%A1%8C">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#背景執行</span>`</div><div id="bkmrk-docker-compose-up--d">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker-compose up -d</span>`</div><div id="bkmrk--60"></div><div id="bkmrk-%E5%81%9C%E6%AD%A2%2F%E5%95%9F%E5%8B%95docker-compose"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**停止/啟動docker compose**</span></span></div><div id="bkmrk-docker-compose-stop">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker-compose stop</span>`</div><div id="bkmrk--61"></div><div id="bkmrk-%E7%A7%BB%E9%99%A4docker-compose"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**移除docker compose**</span></span></div><div id="bkmrk-docker-compose-down">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker-compose down</span>`</div><div id="bkmrk-%23%E4%B9%9F%E5%90%8C%E6%AD%A5%E7%A7%BB%E9%99%A4volume">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#也同步移除volume</span>`</div><div id="bkmrk-docker-compose-down-">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker-compose down -v</span>`</div><div id="bkmrk--62"></div><div id="bkmrk-%E5%88%97%E5%87%BAcontainers"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**列出containers**</span></span></div><div id="bkmrk-docker-compose-ps">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker-compose ps</span>`</div><div id="bkmrk--63"></div><div id="bkmrk-%E7%9B%A3%E7%9C%8Blogs"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**監看logs**</span></span></div><div id="bkmrk-docker-compose-logs">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker-compose logs</span>`</div><div id="bkmrk-%23follow-logs">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#follow logs</span>`</div><div id="bkmrk-docker-compose-logs-">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker-compose logs -f</span>`</div><div id="bkmrk--64"></div><div id="bkmrk-%E5%9F%B7%E8%A1%8C%E7%A8%8B%E5%BC%8F"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**執行程式**</span></span></div><div id="bkmrk-docker-compose-exec-">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker-compose exec webapp sh</span>`</div><div id="bkmrk--65"></div><div id="bkmrk-%E9%A1%AF%E7%A4%BA%E5%9F%B7%E8%A1%8C%E7%A8%8B%E5%BA%8F"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**顯示執行程序**</span></span></div><div id="bkmrk-docker-compose-top">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker-compose top</span>`</div><div id="bkmrk--66"></div><div id="bkmrk--67"></div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Docker Compose 環境變數</span>

<div id="bkmrk-environment"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**environment**</span></span></div><div id="bkmrk-environment%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">environment:</span>`</div><div id="bkmrk-%C2%A0-rack_env%3A-developm">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  RACK_ENV: development</span>`</div><div id="bkmrk-%C2%A0-show%3A-%27true%27">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  SHOW: 'true'</span>`</div><div id="bkmrk-%C2%A0-session_secret%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  SESSION_SECRET:</span>`</div><div id="bkmrk--68"></div><div id="bkmrk-environment%3A-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">environment:</span>`</div><div id="bkmrk-%C2%A0---rack_env%3Ddevelop">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  - RACK_ENV=development</span>`</div><div id="bkmrk-%C2%A0---show%3Dtrue">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  - SHOW=true</span>`</div><div id="bkmrk-%C2%A0---session_secret">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  - SESSION_SECRET</span>`</div><div id="bkmrk--69"></div><div id="bkmrk-env_file%C2%A0"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**env\_file** </span></span></div><div id="bkmrk-.env"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">.env</span></div><div id="bkmrk-var%3Dhello">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">VAR=hello</span>`</div><div id="bkmrk-myenv%3Ddevelopment">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">MYENV=development</span>`</div><div id="bkmrk--70"></div><div id="bkmrk-env_file%3A-.env">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">env_file: .env</span>`</div><div id="bkmrk--71"></div><div id="bkmrk-env_file%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">env_file:</span>`</div><div id="bkmrk-%C2%A0---.%2Fcommon.env">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  - ./common.env</span>`</div><div id="bkmrk-%C2%A0---.%2Fapps%2Fweb.env">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  - ./apps/web.env</span>`</div><div id="bkmrk-%C2%A0---%2Fopt%2Fruntime_opt">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  - /opt/runtime_opts.env</span>`</div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Docker Compose 健康檢查</span>

<div id="bkmrk-healthcheck%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">healthcheck:</span>`</div><div id="bkmrk-%C2%A0-test%3A-%5B%22cmd%22%2C-%22cur">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  test: ["CMD", "curl", "-f", "http://localhost"]</span>`</div><div id="bkmrk-%C2%A0-interval%3A-1m30s">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  interval: 1m30s</span>`</div><div id="bkmrk-%C2%A0-timeout%3A-10s">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  timeout: 10s</span>`</div><div id="bkmrk-%C2%A0-retries%3A-3">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  retries: 3</span>`</div><div id="bkmrk-%C2%A0-start_period%3A-40s">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  start_period: 40s</span>`</div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Docker Compose 起動順序</span>

<div id="bkmrk-version%3A-%223%22-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">version: "3"</span>`</div><div id="bkmrk-services%3A-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">services:</span>`</div><div id="bkmrk-%C2%A0-web%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  web:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-build%3A-.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    build: .</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-ports%3A-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    ports:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---%2280%3A8000%22">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - "80:8000"</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-depends_on%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    </span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>depends_on</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---%22db%22">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - "db"</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-command%3A-%5B%22.%2Fwai">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    command: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]</span>`</div><div id="bkmrk-%C2%A0-db%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  db:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-image%3A-postgres">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    image: postgres</span>`</div><div id="bkmrk-%E5%B0%8F%E5%B7%A5%E5%85%B7"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**![hammer and pick](https://paper.dropboxstatic.com/static/img/ace/emoji/2692.png?version=6.0.0 "hammer and pick")**</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> **小工具**</span></span></div>- <span class="attrlink url author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">[wait-for-it](https://github.com/vishnubob/wait-for-it)</span>
- <span class="attrlink url author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">[wait-for](https://github.com/Eficode/wait-for)</span>

## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Docker Compose 磁碟掛載</span>

<div id="bkmrk--72"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"image","url":"https://docs.docker.com/storage/images/types-of-mounts-volume.png","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"volumes on the Docker host\n","attribs":"*0+q|1+1"},"pool":{"numToAttrib":{"0":["author","d.iX86Va0dCNNJDjPG9iZa3ls0ROswnpuOedberDa3xTLqmSmT1K"]},"attribToNum":{"author,d.iX86Va0dCNNJDjPG9iZa3ls0ROswnpuOedberDa3xTLqmSmT1K":0},"nextNum":1,"dirty":true,"firstDirtyNum":0}}}}]}" data-ace-gallery-urls="https://docs.docker.com/storage/images/types-of-mounts-volume.png">![](https://docs.docker.com/storage/images/types-of-mounts-volume.png)</span></span></div><div id="bkmrk--73"></div><div id="bkmrk-long-syntax"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Long syntax</span></div><div id="bkmrk-version%3A-%223.9%22">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">version: "3.9"</span>`</div><div id="bkmrk-services%3A-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">services:</span>`</div><div id="bkmrk-%C2%A0-web%3A-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  web:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-image%3A-nginx%3Aalp">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    image: nginx:alpine</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-volumes%3A-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    </span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>volumes</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---type%3A-volume">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - type: volume</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-source%3A-myda">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        source: mydata</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-target%3A-%2Fdat">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        target: /data</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-volume%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        volume:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-nocopy%3A-tr">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">          </span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>nocopy</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">: true</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---type%3A-bind">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - type: bind</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-source%3A-.%2Fst">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        source: ./static</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-target%3A-%2Fopt">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        target: /opt/app/static</span>`</div><div id="bkmrk-%C2%A0-12">` `</div><div id="bkmrk-%C2%A0-db%3A-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  db:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-image%3A-postgres%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    image: postgres:latest</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-volumes%3A-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    </span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>volumes</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---%22%2Fvar%2Frun%2Fpo">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---%22dbdata%3A%2Fvar">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - "dbdata:/var/lib/postgresql/data"</span>`</div><div id="bkmrk-%C2%A0-13">` `</div><div id="bkmrk-volumes%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>volumes</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">:</span>`</div><div id="bkmrk-%C2%A0-mydata%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  mydata:</span>`</div><div id="bkmrk-%C2%A0-dbdata%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  dbdata:</span>`</div><div id="bkmrk--74"></div><div id="bkmrk-short-syntax"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Short syntax</span></div><div id="bkmrk-volumes%3A-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">volumes:</span>`</div><div id="bkmrk-%C2%A0-%23-just-specify-a-p">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  # Just specify a path and let the Engine create a volume</span>`</div><div id="bkmrk-%C2%A0---%2Fvar%2Flib%2Fmysql">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  - /var/lib/mysql</span>`</div><div id="bkmrk-%C2%A0-14">` `</div><div id="bkmrk-%C2%A0-%23-specify-an-absol">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  # Specify an absolute path mapping</span>`</div><div id="bkmrk-%C2%A0---%2Fopt%2Fdata%3A%2Fvar%2Fl">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  - /opt/data:/var/lib/mysql</span>`</div><div id="bkmrk-%C2%A0-15">` `</div><div id="bkmrk-%C2%A0-%23-path-on-the-host">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  # Path on the host, relative to the Compose file</span>`</div><div id="bkmrk-%C2%A0---.%2Fcache%3A%2Ftmp%2Fcac">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  - ./cache:/tmp/cache</span>`</div><div id="bkmrk-%C2%A0-16">` `</div><div id="bkmrk-%C2%A0-%23-user-relative-pa">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  # User-relative path</span>`</div><div id="bkmrk-%C2%A0---%7E%2Fconfigs%3A%2Fetc%2Fc">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  - ~/configs:/etc/configs/:ro</span>`</div><div id="bkmrk-%C2%A0-17">` `</div><div id="bkmrk-%C2%A0-%23-named-volume">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  # Named volume</span>`</div><div id="bkmrk-%C2%A0---datavolume%3A%2Fvar%2F">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  - datavolume:/var/lib/mysql</span>`</div># <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">![fireworks](https://paper.dropboxstatic.com/static/img/ace/emoji/1f386.png?version=6.0.0 "fireworks")</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 如何導入Docker</span>

## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Docker導入流程</span>

1. <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">確認應用程式使用的程式語言與版本</span>
2. <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">參考相同程式語言的Dockerfile寫法</span>
3. <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">列出應用程式相依的套件(包含系統、語言、字型等等)</span>
4. <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">列出應用程式的設定(環境變數、設定檔)</span>
5. <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">撰寫Dockerfile並測試</span>
6. <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">檢查是否有檔案不該加入映像檔中( </span><span class="inline-code author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">.dockerignore</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">)</span>
7. <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">列出應用程式相依的服務(Database、Redis)</span>
8. <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">確認服務啟動順序並撰寫Docker Compose yaml</span>

## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">實作：Node.js + MongoDB打造API服務</span>

<div id="bkmrk--75"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"image","url":"https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634269999196_image.png","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"source:https://codetree.dev/node-rest-api-tutorial/\n","attribs":"*0+1f|1+1"},"pool":{"numToAttrib":{"0":["author","d.iX86Va0dCNNJDjPG9iZa3ls0ROswnpuOedberDa3xTLqmSmT1K"]},"attribToNum":{"author,d.iX86Va0dCNNJDjPG9iZa3ls0ROswnpuOedberDa3xTLqmSmT1K":0},"nextNum":1,"dirty":true,"firstDirtyNum":0}}}}]}" data-ace-gallery-urls="https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634269999196_image.png">![](https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1634269999196_image.png)</span></span></div><div id="bkmrk-https%3A%2F%2Fgithub.com%2Fm"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://github.com/macchiang/node-express-mongo-example","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://github.com/macchiang/node-express-mongo-example">[https://github.com/macchiang/node-express-mongo-example](https://github.com/macchiang/node-express-mongo-example)  
</span></span></div><div id="bkmrk-%E9%80%8F%E9%81%8E-dockerfile-%E9%83%A8%E7%BD%B2-nod"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**透過 Dockerfile 部署 Node.js 環境** </span></span></div><div id="bkmrk-%23-base-image">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># Base image</span>`</div><div id="bkmrk-from-node%3A16-alpine">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">FROM node:16-alpine</span>`</div><div id="bkmrk-%C2%A0-18">` `</div><div id="bkmrk-run-apk-upgrade---no">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN apk upgrade --no-cache</span>`</div><div id="bkmrk-%C2%A0-19">` `</div><div id="bkmrk-%23-create-app-directo">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># Create app directory</span>`</div><div id="bkmrk-run-mkdir--p-%2Fapp">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN mkdir -p /app</span>`</div><div id="bkmrk-workdir-%2Fapp-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">WORKDIR /app</span>`</div><div id="bkmrk-%C2%A0-20">` `</div><div id="bkmrk-%23-install-app-depend">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># Install app dependencies</span>`</div><div id="bkmrk-copy-package.json-pa">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY package.json package-lock.json ./</span>`</div><div id="bkmrk-run-npm-install">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN npm install</span>`</div><div id="bkmrk-%C2%A0-21">` `</div><div id="bkmrk-%23-copy-app-source">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># copy app source</span>`</div><div id="bkmrk-copy-.-%2Fapp">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY . /app</span>`</div><div id="bkmrk-%C2%A0-22">` `</div><div id="bkmrk-%23-service-port">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># service port</span>`</div><div id="bkmrk-expose-3000">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">EXPOSE 3000</span>`</div><div id="bkmrk-%C2%A0-23">` `</div><div id="bkmrk-cmd-%5B-%22node%22%2C-%22index">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">CMD [ "node", "index.js"]</span>`</div><div id="bkmrk--76"></div><div id="bkmrk-docker-compose-yaml"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**Docker Compose YAML**</span></span></div><div id="bkmrk-version%3A-%223.9%22-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">version: "3.9"</span>`</div><div id="bkmrk-services%3A-3">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">services:</span>`</div><div id="bkmrk-%C2%A0-express%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  express:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-build%3A-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    build:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-context%3A-.%2F">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      context: ./</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-dockerfile%3A-do-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      dockerfile: Dockerfile</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-image%3A-express%3Al">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    image: express:latest</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-ports%3A-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    ports:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---3000%3A3000">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - 3000:3000</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-depends_on%3A-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    depends_on:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---mongo">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - mongo</span>`</div><div id="bkmrk-%C2%A0-mongo%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  mongo:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-image%3A-mongo%3A5">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    image: mongo:5</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-ports%3A-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    ports:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---27017%3A27017">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - 27017:27017</span>`</div><div id="bkmrk-%C2%A0-24">` `</div><div id="bkmrk-volumes%3A-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">volumes:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-mongo_data%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    mongo_data:</span>`</div><div id="bkmrk--77"></div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">![house with garden](https://paper.dropboxstatic.com/static/img/ace/emoji/1f3e1.png?version=6.0.0 "house with garden")</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 作業-health check的妙用</span>

<div id="bkmrk-%E8%AB%8B%E5%9C%A8node.js-%2B-mongodb%E7%9A%84">- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">請在Node.js + MongoDB的 Docker Compose YAML中加入health check，以確保當MongoDB啟動後，才啟動express</span>

</div># <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">![soccer ball](https://paper.dropboxstatic.com/static/img/ace/emoji/26bd.png?version=6.0.0 "soccer ball")</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> Docker X Python實作：快速打造 LINE Bot</span>

## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">透過 Dockerfile 建立 Python 環境</span>

<div id="bkmrk-%E7%A2%BA%E8%AA%8Dpython%E7%9A%84image%E8%88%87%E7%89%88%E6%9C%AC"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**確認python的image與版本**</span></span></div><div id="bkmrk-https%3A%2F%2Fhub.docker.c"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z url">[https://hub.docker.com/\_/python](https://hub.docker.com/_/python)</span></div><div id="bkmrk--78"></div><div id="bkmrk-%E4%BA%86%E8%A7%A3dockerfile"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**了解Dockerfile**</span></span></div><div id="bkmrk-from-python%3A3-slim-b">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">FROM python:3</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>-</strong></span><span class="attrlink url author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><a class="attrlink" data-target-href="https://hub.docker.com/layers/python/library/python/slim-bullseye/images/sha256-e1b23e3cca282283cfe8c7b14ab184208824337f0c9c64fce284737fa5cb0f4e?context=explore" href="https://hub.docker.com/layers/python/library/python/slim-bullseye/images/sha256-e1b23e3cca282283cfe8c7b14ab184208824337f0c9c64fce284737fa5cb0f4e?context=explore" rel="noreferrer nofollow noopener" target="_blank"><strong>slim-bullseye</strong></a></span>`</div><div id="bkmrk-%C2%A0-25">` `</div><div id="bkmrk-workdir-%2Fusr%2Fsrc%2Fapp">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">WORKDIR /usr/src/app</span>`</div><div id="bkmrk-%C2%A0-26">` `</div><div id="bkmrk-copy-requirements.tx">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY requirements.txt ./</span>`</div><div id="bkmrk-run-pip-install---no">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN pip install --no-cache-dir -r requirements.txt</span>`</div><div id="bkmrk-%C2%A0-27">` `</div><div id="bkmrk-copy-.-.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY . .</span>`</div><div id="bkmrk-%C2%A0-28">` `</div><div id="bkmrk-cmd-%5B-%22python%22%2C-%22.%2Fy">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">CMD [ "python", "./your-daemon-or-script.py" ]</span>`</div><div id="bkmrk-%C2%A0-29">` `</div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Flask + Redis 打造計數器</span>

<div id="bkmrk-https%3A%2F%2Fgithub.com%2Fm-0"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://github.com/macchiang/hit-counter","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://github.com/macchiang/hit-counter">[https://github.com/macchiang/hit-counter](https://github.com/macchiang/hit-counter)  
</span></span></div><div id="bkmrk-docker-compose.yml"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker-compose.yml</span></div><div id="bkmrk-version%3A-%272%27">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">version: '2'</span>`</div><div id="bkmrk-services%3A-4">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">services:</span>`</div><div id="bkmrk-%C2%A0-myapp%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  myapp:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-build%3A-.-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    build: .</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-ports%3A-3">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    ports:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0--%2280%3A5000%22">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">     - "80:5000"</span>`</div><div id="bkmrk-%C2%A0-redis-lb%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  redis-lb:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-image%3A-%22redis%3Aal">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    image: "redis:alpine"</span>`</div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">構建 Django Web server</span>

<div id="bkmrk-https%3A%2F%2Fgithub.com%2Fm-1"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://github.com/macchiang/django-todolist","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://github.com/macchiang/django-todolist">[https://github.com/macchiang/django-todolist](https://github.com/macchiang/django-todolist)  
</span></span></div><div id="bkmrk-https%3A%2F%2Fdeveloper.mo"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://developer.mozilla.org/zh-TW/docs/Learn/Server-side/Django/Introduction","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://developer.mozilla.org/zh-TW/docs/Learn/Server-side/Django/Introduction">[https://developer.mozilla.org/zh-TW/docs/Learn/Server-side/Django/Introduction](https://developer.mozilla.org/zh-TW/docs/Learn/Server-side/Django/Introduction)  
</span></span></div><div id="bkmrk-%E5%85%88%E4%BA%86%E8%A7%A3%E5%B0%88%E6%A1%88%E7%9A%84%E5%AE%89%E8%A3%9D%E6%96%B9%E5%BC%8F"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**先了解專案的安裝方式**</span></span></div><div id="bkmrk-dockerfile-0"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**Dockerfile**</span></span></div><div id="bkmrk-from-python%3A3-slim-b-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">FROM python:3</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>-</strong></span><span class="attrlink url author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><a class="attrlink" data-target-href="https://hub.docker.com/layers/python/library/python/slim-bullseye/images/sha256-e1b23e3cca282283cfe8c7b14ab184208824337f0c9c64fce284737fa5cb0f4e?context=explore" href="https://hub.docker.com/layers/python/library/python/slim-bullseye/images/sha256-e1b23e3cca282283cfe8c7b14ab184208824337f0c9c64fce284737fa5cb0f4e?context=explore" rel="noreferrer nofollow noopener" target="_blank"><strong>slim-bullseye</strong></a></span>`</div><div id="bkmrk-%C2%A0-30">` `</div><div id="bkmrk-workdir-%2Fapp-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">WORKDIR /app</span>`</div><div id="bkmrk-%C2%A0-31">` `</div><div id="bkmrk-copy-requirements.tx-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY requirements.txt ./</span>`</div><div id="bkmrk-run-pip-install---no-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN pip install --no-cache-dir -r requirements.txt</span>`</div><div id="bkmrk-%C2%A0-32">` `</div><div id="bkmrk-copy-todo%2F%2A-.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY todo/* .</span>`</div><div id="bkmrk-run-python-manage.py">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN python manage.py migrate</span>`</div><div id="bkmrk-cmd-%5B-%22python%22%2C-%22man">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">CMD [ "python", "manage.py", "runserver" ]</span>`</div><div id="bkmrk--79"></div><div id="bkmrk-docker-compose.yaml"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**docker-compose.yaml**</span></span></div><div id="bkmrk-version%3A-%273.9%27">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">version: '3.9'</span>`</div><div id="bkmrk-services%3A-5">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">services:</span>`</div><div id="bkmrk-%C2%A0-myweb%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  myweb:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-build%3A-.-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    build: .</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-ports%3A-4">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    ports:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0--%228000%3A8000%22">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">     - "8000:8000"</span>`</div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">部署 LINE Bot 應用</span>

<div id="bkmrk-https%3A%2F%2Fgithub.com%2Fm-2"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://github.com/macchiang/line-bot-tutorial","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://github.com/macchiang/line-bot-tutorial">[https://github.com/macchiang/line-bot-tutorial](https://github.com/macchiang/line-bot-tutorial)  
</span></span></div><div id="bkmrk-https%3A%2F%2Fgithub.com%2Fl"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://github.com/line/line-bot-sdk-python/tree/master/examples/simple-server-echo","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://github.com/line/line-bot-sdk-python/tree/master/examples/simple-server-echo">[https://github.com/line/line-bot-sdk-python/tree/master/examples/simple-server-echo](https://github.com/line/line-bot-sdk-python/tree/master/examples/simple-server-echo)  
</span></span></div><div id="bkmrk--80"></div><div id="bkmrk-%E5%9C%A8%E4%BD%A0%E9%96%8B%E5%A7%8B%E4%B9%8B%E5%89%8D"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**在你開始之前**</span></span></div><div id="bkmrk-%E7%A2%BA%E4%BF%9D%E6%82%A8%E5%85%B7%E6%9C%89%E4%BB%A5%E4%B8%8B%E5%85%A7%E5%AE%B9%EF%BC%9A"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">確保您具有以下內容：</span></div>- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">擁有 Line 帳號</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">擁有 </span><span class="attrlink url author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">[Heroku](https://www.heroku.com/)</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 帳戶（您可以免費創建一個）</span>

<div id="bkmrk--81"></div><div id="bkmrk-%E5%BB%BA%E7%AB%8Bline-bot-%E9%A0%BB%E9%81%93"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**建立LINE Bot 頻道**</span></span></div>- <span class="attrlink url author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">[Messaging API 介紹](https://developers.line.biz/zh-hant/docs/messaging-api/overview/)</span>
- <span class="attrlink url author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">[開始使用 Messaging API](https://developers.line.biz/zh-hant/docs/messaging-api/getting-started/)</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">取得 </span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**Channel access token**</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 與 </span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**Channel secret**</span>

<div id="bkmrk--82"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"image","url":"https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636469446904_image.png","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"Channel secret\n","attribs":"*0+e|1+1"},"pool":{"numToAttrib":{"0":["author","d.iX86Va0dCNNJDjPG9iZa3ls0ROswnpuOedberDa3xTLqmSmT1K"]},"attribToNum":{"author,d.iX86Va0dCNNJDjPG9iZa3ls0ROswnpuOedberDa3xTLqmSmT1K":0},"nextNum":1,"dirty":true,"firstDirtyNum":0}}}}]}" data-ace-gallery-urls="https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636469446904_image.png">![](https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636469446904_image.png)</span></span></div><div id="bkmrk--83"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"image","url":"https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636469390721_image.png","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"Channel access token\n","attribs":"*0+k|1+1"},"pool":{"numToAttrib":{"0":["author","d.iX86Va0dCNNJDjPG9iZa3ls0ROswnpuOedberDa3xTLqmSmT1K"]},"attribToNum":{"author,d.iX86Va0dCNNJDjPG9iZa3ls0ROswnpuOedberDa3xTLqmSmT1K":0},"nextNum":1,"dirty":true,"firstDirtyNum":0}}}}]}" data-ace-gallery-urls="https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636469390721_image.png">![](https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636469390721_image.png)</span></span></div>- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">關閉預設罐頭回覆訊息</span>

<div id="bkmrk--84"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"image","url":"https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636504016837_image.png","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636504016837_image.png">![](https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636504016837_image.png)</span></span></div><div id="bkmrk-%E5%BB%BA%E7%AB%8Bdocker-image-0"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**建立Docker Image**</span></span></div><div id="bkmrk-from-python%3A3-slim-b-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">FROM python:3-slim-bullseye</span>`</div><div id="bkmrk-workdir-%2Fapp-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">WORKDIR /app</span>`</div><div id="bkmrk-copy-requirements.tx-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY requirements.txt ./</span>`</div><div id="bkmrk-run-pip-install---no-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN pip install --no-cache-dir -r requirements.txt</span>`</div><div id="bkmrk-copy-app.py-.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY app.py .</span>`</div><div id="bkmrk-cmd-%5B-%22python%22%2C-%22app">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">CMD [ "python", "app.py"]</span>`</div><div id="bkmrk--85"></div><div id="bkmrk-docker-build-.--t-li">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker build . -t line-bot:latest</span>`</div><div id="bkmrk--86"></div><div id="bkmrk-%E5%AE%89%E8%A3%9Dheroku-cli"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**安裝Heroku CLI**</span></span></div><div id="bkmrk-https%3A%2F%2Fdevcenter.he"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://devcenter.heroku.com/articles/heroku-cli#download-and-install","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://devcenter.heroku.com/articles/heroku-cli#download-and-install">[https://devcenter.heroku.com/articles/heroku-cli#download-and-install](https://devcenter.heroku.com/articles/heroku-cli#download-and-install)  
</span></span></div><div id="bkmrk-%E5%BB%BA%E7%AB%8Bheroku-app"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**建立Heroku App**</span></span></div><div id="bkmrk-%23%E7%99%BB%E5%85%A5heroku">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#登入heroku</span>`</div><div id="bkmrk-heroku-login">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">heroku login</span>`</div><div id="bkmrk-%23%E7%99%BB%E5%85%A5heroku-registry">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#登入heroku registry</span>`</div><div id="bkmrk-heroku-container%3Alog">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">heroku container:login</span>`</div><div id="bkmrk-%23%E5%BB%BA%E7%AB%8Bapp">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#建立app</span>`</div><div id="bkmrk-heroku-create">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">heroku create</span>`</div><div id="bkmrk-%C2%A0-33">` `</div><div id="bkmrk-%23creating-app...-don">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#Creating app... done, ⬢ morning-journey-43865</span>`</div><div id="bkmrk-%23https%3A%2F%2Fmorning-jou">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#</span><span class="highlight author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z" data-highlight-color="#FFBFB5"><strong>https://morning-journey-43865.herokuapp.com/</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> | https://git.heroku.com/morning-journey-43865.git</span>`</div><div id="bkmrk-%C2%A0-34">` `</div><div id="bkmrk-%23%E6%8E%A8%E9%80%81docker-image%E8%87%B3hero">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#推送docker image至heroku registry</span>`</div><div id="bkmrk-docker-tag-line-bot%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker tag line-bot:latest registry.heroku.com/</span><span class="highlight author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z" data-highlight-color="#F7CC62"><strong>morning-journey-43865</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">/web</span>`</div><div id="bkmrk-docker-push-registry">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker push registry.heroku.com/</span><span class="highlight author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z" data-highlight-color="#F7CC62"><strong>morning-journey-43865</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">/web</span>`</div><div id="bkmrk-%C2%A0-35">` `</div><div id="bkmrk-%C2%A0-36">` `</div><div id="bkmrk-%23%E8%A8%AD%E5%AE%9A%E7%92%B0%E5%A2%83%E8%AE%8A%E6%95%B8">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#設定環境變數</span>`</div><div id="bkmrk-heroku-config%3Aset-ch">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">heroku config:set CHANNEL_ACCESS_TOKEN=xxxxxxxxx</span>`</div><div id="bkmrk-heroku-config%3Aset-ch-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">heroku config:set CHANNEL_SECRET=xxxxxxxxx</span>`</div><div id="bkmrk-%C2%A0-37">` `</div><div id="bkmrk-%23deploy-docker-image">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#deploy docker image</span>`</div><div id="bkmrk-heroku-container%3Arel">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">heroku container:release web</span>`</div><div id="bkmrk--87"></div><div id="bkmrk-%E8%A8%AD%E5%AE%9Awebhook"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**設定Webhook**</span></span></div><div id="bkmrk--88"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"image","url":"https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636471948301_image.png","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636471948301_image.png">![](https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636471948301_image.png)</span></span></div><div id="bkmrk--89"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"image","url":"https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636471973201_image.png","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636471973201_image.png">![](https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636471973201_image.png)</span></span></div><div id="bkmrk--90"></div><div id="bkmrk--91"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"image","url":"https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636504063885_image.png","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636504063885_image.png">![](https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636504063885_image.png)</span></span></div><div id="bkmrk-https%3A%2F%2Fdevcenter.he-0"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://devcenter.heroku.com/articles/container-registry-and-runtime","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://devcenter.heroku.com/articles/container-registry-and-runtime">[https://devcenter.heroku.com/articles/container-registry-and-runtime](https://devcenter.heroku.com/articles/container-registry-and-runtime)  
</span></span></div><div id="bkmrk-%E5%8A%A0%E5%85%A5%E5%A5%BD%E5%8F%8B%E8%88%87%E6%B8%AC%E8%A9%A6"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**加入好友與測試**</span></span></div><div id="bkmrk--92"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"image","url":"https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636504317204_image.png","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636504317204_image.png">![](https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636504317204_image.png)</span></span></div><div id="bkmrk--93"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"image","url":"https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636504378568_image.png","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636504378568_image.png">![](https://paper-attachments.dropbox.com/s_02C5CCE7C60EF0F5CFCCC6A693EC6F4D19DF8DD8DD90E613893867B993C44DE5_1636504378568_image.png)</span></span></div><div id="bkmrk-debug"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**Debug**</span></span></div><div id="bkmrk-%E2%9D%AF-heroku-logs---tail">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">❯ </span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>heroku logs --tail</strong></span>`</div><div id="bkmrk-2021-11-09t15%3A17%3A06.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:17:06.932541+00:00 app[api]: Release v1 created by user macchiang@gmail.com</span>`</div><div id="bkmrk-2021-11-09t15%3A17%3A06.-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:17:06.932541+00:00 app[api]: Initial release by user macchiang@gmail.com</span>`</div><div id="bkmrk-2021-11-09t15%3A17%3A07.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:17:07.532399+00:00 app[api]: Release v2 created by user macchiang@gmail.com</span>`</div><div id="bkmrk-2021-11-09t15%3A17%3A07.-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:17:07.532399+00:00 app[api]: Enable Logplex by user macchiang@gmail.com</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A12.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:12.485507+00:00 app[api]: Deployed web (1be43e5135d6) by user macchiang@gmail.com</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A12.-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:12.485507+00:00 app[api]: Release v3 created by user macchiang@gmail.com</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A12.-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:12.503987+00:00 app[api]: Scaled to web@1:Free by user macchiang@gmail.com</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A15.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:15.916499+00:00 heroku[web.1]: Starting process with command `python app.py`</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A18.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:18.365293+00:00 app[web.1]: Traceback (most recent call last):</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A18.-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:18.365308+00:00 app[web.1]: File "/app/app.py", line 15, in <module></span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A18.-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:18.365410+00:00 app[web.1]: line_bot_api = LineBotApi(os.getenv('CHANNEL_ACCESS_TOKEN'))</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A18.-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:18.365411+00:00 app[web.1]: File "/usr/local/lib/python3.10/site-packages/linebot/api.py", line 63, in __init__</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A18.-3">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:18.365516+00:00 app[web.1]: 'Authorization': 'Bearer ' + channel_access_token,</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A18.-4">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:18.374292+00:00 app[web.1]: TypeError: can only concatenate str (not "NoneType") to str</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A18.-5">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:18.660220+00:00 heroku[web.1]: Process exited with status 1</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A19.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:19.074969+00:00 heroku[web.1]: State changed from starting to crashed</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A19.-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:19.218365+00:00 heroku[web.1]: State changed from crashed to starting</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A22.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:22.107500+00:00 heroku[web.1]: Starting process with command `python app.py`</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A23.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:23.219784+00:00 app[web.1]: Traceback (most recent call last):</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A23.-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:23.219806+00:00 app[web.1]: File "/app/app.py", line 15, in <module></span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A23.-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:23.219930+00:00 app[web.1]: line_bot_api = LineBotApi(os.getenv('CHANNEL_ACCESS_TOKEN'))</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A23.-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:23.219934+00:00 app[web.1]: File "/usr/local/lib/python3.10/site-packages/linebot/api.py", line 63, in __init__</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A23.-3">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:23.219959+00:00 app[web.1]: 'Authorization': 'Bearer ' + channel_access_token,</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A23.-4">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:23.219961+00:00 app[web.1]: TypeError: can only concatenate str (not "NoneType") to str</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A23.-5">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:23.417290+00:00 heroku[web.1]: Process exited with status 1</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A23.-6">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:23.492672+00:00 heroku[web.1]: State changed from starting to crashed</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A38.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:38.443725+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=morning-journey-43865.herokuapp.com request_id=b91dba06-950e-4887-840e-60fc5986866f fwd="36.227.157.168" dyno= connect= service= status=503 bytes= protocol=https</span>`</div><div id="bkmrk-2021-11-09t15%3A22%3A39.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">2021-11-09T15:22:39.424038+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=morning-journey-43865.herokuapp.com request_id=becc5a52-35a7-4557-b751-02d382a2b67e fwd="36.227.157.168" dyno= connect= service= status=503 bytes= protocol=https</span>`</div># <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">![american football](https://paper.dropboxstatic.com/static/img/ace/emoji/1f3c8.png?version=6.0.0 "american football")</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> Docker X PHP實作：架設一個 WordPress 網站</span>

## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">透過 Dockerfile 部署 PHP 環境</span>

<div id="bkmrk-%E5%85%88%E5%BE%9Ephp%E5%AE%98%E6%96%B9dockerfile%E5%AD%B8%E8%B5%B7"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**先從**</span><span class="attrlink url author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">[**Php官方**](https://hub.docker.com/_/php)</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**Dockerfile學起**</span></span></div><div id="bkmrk-https%3A%2F%2Fgithub.com%2Fm-3"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://github.com/macchiang/php-hello-world","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://github.com/macchiang/php-hello-world">[https://github.com/macchiang/php-hello-world](https://github.com/macchiang/php-hello-world)  
</span></span></div><div id="bkmrk-dockerfile-1"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Dockerfile</span></div><div id="bkmrk-from-php%3A7.3-apache">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">FROM php:7.3-apache</span>`</div><div id="bkmrk-copy-index.php-%2Fvar%2F">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY index.php /var/www/html/</span>`</div><div id="bkmrk--94"></div><div id="bkmrk-%E5%BB%BA%E7%AB%8Bdocker-image%E8%88%87conta"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">建立Docker image與Container</span></div><div id="bkmrk-docker-build-.--t-he">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker build . -t hello:latest</span>`</div><div id="bkmrk-docker-run--it---rm--0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker run -it --rm -p 8080:80 hello:latest</span>`</div><div id="bkmrk-https%3A%2F%2Fwww.astralwe"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://www.astralweb.com.tw/what-is-differences-between-fastcgi-php-fpm/","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://www.astralweb.com.tw/what-is-differences-between-fastcgi-php-fpm/">[https://www.astralweb.com.tw/what-is-differences-between-fastcgi-php-fpm/](https://www.astralweb.com.tw/what-is-differences-between-fastcgi-php-fpm/)  
</span></span></div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">將 MySQL 加入部署行列</span>

<div id="bkmrk-https%3A%2F%2Fgithub.com%2Fm-4"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://github.com/macchiang/php-docker-simple","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://github.com/macchiang/php-docker-simple">[https://github.com/macchiang/php-docker-simple](https://github.com/macchiang/php-docker-simple)  
</span></span></div><div id="bkmrk-docker-compose.yml-0"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker-compose.yml</span></div><div id="bkmrk-%23-use-root%2Fexample-u">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># Use root/example user/password credentials</span>`</div><div id="bkmrk-version%3A-%273.1%27">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">version: '3.1'</span>`</div><div id="bkmrk-%C2%A0-38">` `</div><div id="bkmrk-services%3A-6">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">services:</span>`</div><div id="bkmrk-%C2%A0-php%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  php:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-build%3A-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    build:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-context%3A-.-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      context: .</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-dockerfile%3A-do-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      dockerfile: Dockerfile</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-ports%3A-5">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    ports:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---80%3A80">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - 80:80</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-volumes%3A-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    volumes:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---.%2Fsrc%3A%2Fvar%2Fw">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - ./src:/var/www/html/</span>`</div><div id="bkmrk-%C2%A0-39">` `</div><div id="bkmrk-%C2%A0-db%3A-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  db:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-image%3A-mysql">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    image: mysql</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-command%3A---defau">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    command: --default-authentication-plugin=mysql_native_password</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-restart%3A-always">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    restart: always</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-environment%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    environment:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-mysql_root_pas">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      MYSQL_ROOT_PASSWORD: example</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-volumes%3A-3">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    volumes:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---mysql-data%3A%2F">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - mysql-data:/var/lib/mysql</span>`</div><div id="bkmrk-%C2%A0-40">` `</div><div id="bkmrk-%C2%A0-adminer%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  adminer:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-image%3A-adminer">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    image: adminer</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-restart%3A-always-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    restart: always</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-ports%3A-6">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    ports:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---8080%3A8080">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - 8080:8080</span>`</div><div id="bkmrk-%C2%A0-41">` `</div><div id="bkmrk-volumes%3A-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">volumes:</span>`</div><div id="bkmrk-%C2%A0-mysql-data%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  mysql-data:</span>`</div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">建立WordPress 網站</span>

<div id="bkmrk-%E5%86%8D%E7%94%B1wordpresss%E5%AE%98%E6%96%B9docker"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**再由**</span><span class="attrlink url author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">[**WordPresss官方Dockerfile學起**](https://github.com/docker-library/wordpress/blob/master/latest/php7.3/apache/Dockerfile)</span></span></div><div id="bkmrk-%C2%A0%23">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> #</span>`</div><div id="bkmrk-%23-note%3A-this-dockerf">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># NOTE: THIS DOCKERFILE IS GENERATED VIA "apply-templates.sh"</span>`</div><div id="bkmrk-%23">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#</span>`</div><div id="bkmrk-%23-please-do-not-edit">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># PLEASE DO NOT EDIT IT DIRECTLY.</span>`</div><div id="bkmrk-%23-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">#</span>`</div><div id="bkmrk-%C2%A0-42">` `</div><div id="bkmrk-from-php%3A7.3-apache-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">FROM php:7.3-apache</span>`</div><div id="bkmrk-%C2%A0-43">` `</div><div id="bkmrk-%23-persistent-depende">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># persistent dependencies</span>`</div><div id="bkmrk-run-set--eux%3B-%5C">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN set -eux; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-apt-get-upda">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        apt-get update; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-apt-get-inst">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        apt-get install -y --no-install-recommends \</span>`</div><div id="bkmrk-%23-ghostscript-is-req">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># Ghostscript is required for rendering PDF previews</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-ghos">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                ghostscript \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%3B-%5C">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        ; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-rm--rf-%2Fvar%2F">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        rm -rf /var/lib/apt/lists/*</span>`</div><div id="bkmrk-%C2%A0-44">` `</div><div id="bkmrk-%23-install-the-php-ex">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># install the PHP extensions we need (https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions)</span>`</div><div id="bkmrk-run-set--ex%3B-%5C">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN set -ex; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%5C">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-savedaptmark">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        savedAptMark="$(apt-mark showmanual)"; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%5C-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-apt-get-upda-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        apt-get update; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-apt-get-inst-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        apt-get install -y --no-install-recommends \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-libf">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                libfreetype6-dev \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-libj">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                libjpeg-dev \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-libm">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                libmagickwand-dev \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-libp">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                libpng-dev \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-libw">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                libwebp-dev \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-libz">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                libzip-dev \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%3B-%5C-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        ; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%5C-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-docker-php-e">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        </span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>docker-php-ext-configure</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> gd \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0---wi">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                --with-freetype-dir=/usr \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0---wi-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                --with-jpeg-dir=/usr \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0---wi-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                --with-png-dir=/usr \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0---wi-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                --with-webp-dir=/usr \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%3B-%5C-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        ; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-docker-php-e-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        </span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>docker-php-ext-install</strong></span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> -j "$(nproc)" \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-bcma">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                bcmath \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-exif">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                exif \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-gd-%5C">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                gd \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-mysq">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                mysqli \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-zip-">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                zip \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%3B-%5C-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        ; \</span>`</div><div id="bkmrk-%23-https%3A%2F%2Fpecl.php.n">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># https://pecl.php.net/package/imagick</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-pecl-install">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        pecl install imagick-3.5.0; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-docker-php-e-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        docker-php-ext-enable imagick; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-rm--r-%2Ftmp%2Fp">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        rm -r /tmp/pear; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%5C-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        \</span>`</div><div id="bkmrk-%23-reset-apt-mark%27s-%22">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-apt-mark-aut">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        apt-mark auto '.*' > /dev/null; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-apt-mark-man">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        apt-mark manual $savedAptMark; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-ldd-%22%24%28php--">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        ldd "$(php -r 'echo ini_get("extension_dir");')"/*.so \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%7C-aw">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                | awk '/=>/ { print $3 }' \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%7C-so">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                | sort -u \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%7C-xa">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                | xargs -r dpkg-query -S \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%7C-cu">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                | cut -d: -f1 \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%7C-so-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                | sort -u \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%7C-xa-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                | xargs -rt apt-mark manual; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%5C-3">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-apt-get-purg">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-rm--rf-%2Fvar%2F-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        rm -rf /var/lib/apt/lists/*</span>`</div><div id="bkmrk-%C2%A0-45">` `</div><div id="bkmrk-%23-set-recommended-ph">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># set recommended PHP.ini settings</span>`</div><div id="bkmrk-%23-see-https%3A%2F%2Fsecure">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># see https://secure.php.net/manual/en/opcache.installation.php</span>`</div><div id="bkmrk-run-set--eux%3B-%5C-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN set -eux; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-docker-php-e-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        docker-php-ext-enable opcache; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%7B-%5C">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        { \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'opcache.memory_consumption=128'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'opcache.interned_strings_buffer=8'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'opcache.max_accelerated_files=4000'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'opcache.revalidate_freq=2'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-3">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'opcache.fast_shutdown=1'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%7D-%3E-%2Fusr%2Floc">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        } > /usr/local/etc/php/conf.d/opcache-recommended.ini</span>`</div><div id="bkmrk-%23-https%3A%2F%2Fwordpress.">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># https://wordpress.org/support/article/editing-wp-config-php/#configure-error-logging</span>`</div><div id="bkmrk-run-%7B-%5C">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN { \</span>`</div><div id="bkmrk-%23-https%3A%2F%2Fwww.php.ne">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># https://www.php.net/manual/en/errorfunc.constants.php</span>`</div><div id="bkmrk-%23-https%3A%2F%2Fgithub.com">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># https://github.com/docker-library/wordpress/issues/420#issuecomment-517839670</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-4">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'error_reporting = E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_RECOVERABLE_ERROR'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-5">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'display_errors = Off'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-6">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'display_startup_errors = Off'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-7">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'log_errors = On'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-8">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'error_log = /dev/stderr'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-9">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'log_errors_max_len = 1024'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-10">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'ignore_repeated_errors = On'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-11">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'ignore_repeated_source = Off'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-12">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'html_errors = Off'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%7D-%3E-%2Fusr%2Floc-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        } > /usr/local/etc/php/conf.d/error-logging.ini</span>`</div><div id="bkmrk-%C2%A0-46">` `</div><div id="bkmrk-run-set--eux%3B-%5C-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN set -eux; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-a2enmod-rewr">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        a2enmod rewrite expires; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%5C-4">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        \</span>`</div><div id="bkmrk-%23-https%3A%2F%2Fhttpd.apac">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># https://httpd.apache.org/docs/2.4/mod/mod_remoteip.html</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-a2enmod-remo">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        a2enmod remoteip; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%7B-%5C-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        { \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-13">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'RemoteIPHeader X-Forwarded-For'; \</span>`</div><div id="bkmrk-%23-these-ip-ranges-ar">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># these IP ranges are reserved for "private" use and should thus *usually* be safe inside Docker</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-14">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'RemoteIPTrustedProxy 10.0.0.0/8'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-15">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'RemoteIPTrustedProxy 172.16.0.0/12'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-16">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'RemoteIPTrustedProxy 192.168.0.0/16'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-17">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'RemoteIPTrustedProxy 169.254.0.0/16'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-18">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'RemoteIPTrustedProxy 127.0.0.0/8'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%7D-%3E-%2Fetc%2Fapa">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        } > /etc/apache2/conf-available/remoteip.conf; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-a2enconf-rem">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        a2enconf remoteip; \</span>`</div><div id="bkmrk-%23-https%3A%2F%2Fgithub.com-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># https://github.com/docker-library/wordpress/issues/383#issuecomment-507886512</span>`</div><div id="bkmrk-%23-%28replace-all-insta">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># (replace all instances of "%h" with "%a" in LogFormat)</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-find-%2Fetc%2Fap">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        find /etc/apache2 -type f -name '*.conf' -exec sed -ri 's/([[:space:]]*LogFormat[[:space:]]+"[^"]*)%h([^"]*")/\1%a\2/g' '{}' +</span>`</div><div id="bkmrk-%C2%A0-47">` `</div><div id="bkmrk-run-set--eux%3B-%5C-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN set -eux; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-version%3D%275.8">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        version='5.8.2'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-sha1%3D%27c3b1b5">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        sha1='c3b1b59553eafbf301c83b14c5eeae4cf1c86044'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%5C-5">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-curl--o-word">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        curl -o wordpress.tar.gz -fL "https://wordpress.org/wordpress-$version.tar.gz"; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-%22%24sha1-">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        echo "$sha1 *wordpress.tar.gz" | sha1sum -c -; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%5C-6">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        \</span>`</div><div id="bkmrk-%23-upstream-tarballs-">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-tar--xzf-wor">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        tar -xzf wordpress.tar.gz -C /usr/src/; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-rm-wordpress">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        rm wordpress.tar.gz; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%5C-7">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        \</span>`</div><div id="bkmrk-%23-https%3A%2F%2Fwordpress.-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># https://wordpress.org/support/article/htaccess/</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%5B-%21--e-%2Fusr%2F">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        [ ! -e /usr/src/wordpress/.htaccess ]; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%7B-%5C-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        { \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-19">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo '# BEGIN WordPress'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-20">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo ''; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-21">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'RewriteEngine On'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-22">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-23">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'RewriteBase /'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-24">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'RewriteRule ^index\.php$ - [L]'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-25">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'RewriteCond %{REQUEST_FILENAME} !-f'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-26">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'RewriteCond %{REQUEST_FILENAME} !-d'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-27">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo 'RewriteRule . /index.php [L]'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-28">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo ''; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-echo-29">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                echo '# END WordPress'; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%7D-%3E-%2Fusr%2Fsrc">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        } > /usr/src/wordpress/.htaccess; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%5C-8">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-chown--r-www">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        chown -R www-data:www-data /usr/src/wordpress; \</span>`</div><div id="bkmrk-%23-pre-create-wp-cont">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># pre-create wp-content (and single-level children) for folks who want to bind-mount themes, etc so permissions are pre-created properly instead of root:root</span>`</div><div id="bkmrk-%23-wp-content%2Fcache%3A-">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># wp-content/cache: https://github.com/docker-library/wordpress/issues/534#issuecomment-705733507</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-mkdir-wp-con">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        mkdir wp-content; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-for-dir-in-%2F">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        for dir in /usr/src/wordpress/wp-content/*/ cache; do \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-dir%3D">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                dir="$(basename "${dir%/}")"; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-mkdi">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">                mkdir "wp-content/$dir"; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-done%3B-%5C">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        done; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-chown--r-www-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        chown -R www-data:www-data wp-content; \</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-chmod--r-777">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        chmod -R 777 wp-content</span>`</div><div id="bkmrk-%C2%A0-48">` `</div><div id="bkmrk-volume-%2Fvar%2Fwww%2Fhtml">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">VOLUME /var/www/html</span>`</div><div id="bkmrk-%C2%A0-49">` `</div><div id="bkmrk-copy---chown%3Dwww-dat">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY --chown=www-data:www-data wp-config-docker.php /usr/src/wordpress/</span>`</div><div id="bkmrk-copy-docker-entrypoi">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY docker-entrypoint.sh /usr/local/bin/</span>`</div><div id="bkmrk-%C2%A0-50">` `</div><div id="bkmrk-entrypoint-%5B%22docker-">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">ENTRYPOINT ["docker-entrypoint.sh"]</span>`</div><div id="bkmrk-cmd-%5B%22apache2-foregr">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">CMD ["apache2-foreground"]</span>`</div><div id="bkmrk--95"></div><div id="bkmrk-https%3A%2F%2Fgithub.com%2Fm-5"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://github.com/macchiang/wordpress-demo","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://github.com/macchiang/wordpress-demo">[https://github.com/macchiang/wordpress-demo](https://github.com/macchiang/wordpress-demo)  
</span></span></div><div id="bkmrk-docker-compose.yaml-0"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker-compose.yaml</span></div><div id="bkmrk-version%3A-%223.3%22">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">version: "3.3"</span>`</div><div id="bkmrk-services%3A-7">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">services:</span>`</div><div id="bkmrk-%C2%A0-db%3A-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  db:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-image%3A-mysql-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    image: mysql</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-volumes%3A-4">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    volumes:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---db_data%3A%2Fvar">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - db_data:/var/lib/mysql</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-restart%3A-always-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    restart: always</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-environment%3A-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    environment:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-mysql_root_pas-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      MYSQL_ROOT_PASSWORD: somewordpress</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-mysql_database">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      MYSQL_DATABASE: wordpress</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-mysql_user%3A-wo">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      MYSQL_USER: wordpress</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-mysql_password">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      MYSQL_PASSWORD: wordpress</span>`</div><div id="bkmrk-%C2%A0-wordpress%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  wordpress:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-depends_on%3A-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    depends_on:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---db">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - db</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-image%3A-wordpress">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    image: wordpress</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-ports%3A-7">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    ports:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---%228000%3A80%22">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - "8000:80"</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-restart%3A-always-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    restart: always</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-environment%3A-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    environment:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-wordpress_db_h">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      WORDPRESS_DB_HOST: db:3306</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-wordpress_db_u">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      WORDPRESS_DB_USER: wordpress</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-wordpress_db_p">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      WORDPRESS_DB_PASSWORD: wordpress</span>`</div><div id="bkmrk-volumes%3A-3">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">volumes:</span>`</div><div id="bkmrk-%C2%A0-db_data%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  db_data:</span>`</div><div id="bkmrk-%C2%A0-51">` `</div># <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">![ping pong](https://paper.dropboxstatic.com/static/img/ace/emoji/1f3d3.png?version=6.0.0 "ping pong")</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> Docker X Node.js實作：打造前後端具備的 To-Do List</span>

## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">建立Express + Nginx組合</span>

<div id="bkmrk-https%3A%2F%2Fgithub.com%2Fm-6"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://github.com/macchiang/express-nginx","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://github.com/macchiang/express-nginx">[https://github.com/macchiang/express-nginx](https://github.com/macchiang/express-nginx)  
</span></span></div><div id="bkmrk-nginx-config"><span class="ace-all-bold-hthree"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">**Nginx config**</span></span></div><div id="bkmrk-server-%7B">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">server {</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-listen-80-defaul">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    listen 80 default_server;</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-listen-%5B%3A%3A%5D%3A80-d">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    listen [::]:80 default_server;</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-server_tokens-of">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    server_tokens off;</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-client_max_body_">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    client_max_body_size 15M;</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-if-%28%24http_x_forw">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    if ($http_x_forwarded_proto = "http") {</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-return-301-h">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        return 301 https://$host$request_uri;</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%7D">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    }</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-location-%2F-%7B">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    location / {</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-proxy_set_he">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        proxy_set_header X-Real-IP $remote_addr;</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-proxy_set_he-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-proxy_set_he-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        proxy_set_header Host $http_host;</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-proxy_set_he-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        proxy_set_header X-NginX-Proxy true;</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-proxy_pass-h">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        </span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><strong>proxy_pass http://node:3000;</strong></span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-%C2%A0-proxy_redire">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">        proxy_redirect off;</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%7D-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    }</span>`</div><div id="bkmrk-%7D-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">}</span>`</div><div id="bkmrk--96"></div><div id="bkmrk-docker-compose.yml-1"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker-compose.yml</span></div><div id="bkmrk-version%3A-%223%22-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">version: "3"</span>`</div><div id="bkmrk-services%3A-8">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">services:</span>`</div><div id="bkmrk-%C2%A0-nginx%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  nginx:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-image%3A-nginx%3Aalp-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    image: nginx:alpine</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-volumes%3A-5">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    volumes:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---.%2Fnginx%3A%2Fetc">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - ./nginx:/etc/nginx/conf.d</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-links%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    links:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---node">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - node</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-ports%3A-8">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    ports:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---80%3A80-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - 80:80</span>`</div><div id="bkmrk-%C2%A0-node%3A">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  node:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-build%3A-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    build:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-context%3A-.-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      context: .</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-image%3A-express-n">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    image: express-nginx:latest</span>`</div><div id="bkmrk-%C2%A0-52">` `</div>## <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">打造To-Do List</span>

<div id="bkmrk-https%3A%2F%2Fgithub.com%2Fm-7"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://github.com/macchiang/express-mongoDB-TodoList","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://github.com/macchiang/express-mongoDB-TodoList">[https://github.com/macchiang/express-mongoDB-TodoList](https://github.com/macchiang/express-mongoDB-TodoList)  
</span></span></div><div id="bkmrk--97"></div><div id="bkmrk-ddockerfile"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">Ddockerfile</span></div><div id="bkmrk-%23-base-image-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># Base image</span>`</div><div id="bkmrk-from-node%3A16-alpine-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">FROM node:16-alpine</span>`</div><div id="bkmrk-run-apk-upgrade---no-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN apk upgrade --no-cache</span>`</div><div id="bkmrk-%23-create-app-directo-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># Create app directory</span>`</div><div id="bkmrk-run-mkdir--p-%2Fapp-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN mkdir -p /app</span>`</div><div id="bkmrk-workdir-%2Fapp-3">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">WORKDIR /app</span>`</div><div id="bkmrk-%23-install-app-depend-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># Install app dependencies</span>`</div><div id="bkmrk-copy-package.json-pa-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY package.json package-lock.json ./</span>`</div><div id="bkmrk-run-npm-install-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">RUN npm install</span>`</div><div id="bkmrk-%23-copy-app-source-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># copy app source</span>`</div><div id="bkmrk-copy-.-%2Fapp-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">COPY . /app</span>`</div><div id="bkmrk-%23-service-port-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"># service port</span>`</div><div id="bkmrk-expose-3000-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">EXPOSE 3000</span>`</div><div id="bkmrk-cmd-%5B-%22node%22%2C-%22app.j">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">CMD [ "node", "app.js"]</span>`</div><div id="bkmrk--98"></div><div id="bkmrk-docker-compose.yml-2"><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">docker-compose.yml</span></div><div id="bkmrk-version%3A-%223%22-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">version: "3"</span>`</div><div id="bkmrk-services%3A-9">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">services:</span>`</div><div id="bkmrk-%C2%A0-nginx%3A-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  nginx:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-image%3A-nginx%3Aalp-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    image: nginx:alpine</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-volumes%3A-6">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    volumes:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---.%2Fnginx%3A%2Fetc-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - ./nginx:/etc/nginx/conf.d</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-links%3A-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    links:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---node-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - node</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-ports%3A-9">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    ports:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---80%3A80-1">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - 80:80</span>`</div><div id="bkmrk-%C2%A0-node%3A-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  node:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-build%3A-3">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    build:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0-context%3A-.-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      context: .</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-depends_on%3A-2">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    depends_on:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---mongo-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - mongo</span>`</div><div id="bkmrk-%C2%A0-mongo%3A-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">  mongo:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-image%3A-mongo%3A5-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    image: mongo:5</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-ports%3A-10">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    ports:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---27017%3A27017-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">      - 27017:27017</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-volumes%3A-7">`    <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">volumes:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-%C2%A0---mongo_data%3A%2F">`      <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">- mongo_data:/data/db</span>`</div><div id="bkmrk-volumes%3A-4">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">volumes:</span>`</div><div id="bkmrk-%C2%A0-%C2%A0-mongo_data%3A-0">`<span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">    mongo_data:</span>`</div># <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">![open book](https://paper.dropboxstatic.com/static/img/ace/emoji/1f4d6.png?version=6.0.0 "open book")</span><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"> 參考資料</span>

- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z url">[https://blog.gtwang.org/linux/docker-commands-and-container-management-tutorial/](https://blog.gtwang.org/linux/docker-commands-and-container-management-tutorial/)</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z url">[https://hub.docker.com/r/broadtech/alpine-apache2/dockerfile](https://hub.docker.com/r/broadtech/alpine-apache2/dockerfile)</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z url">[https://ithelp.ithome.com.tw/articles/10251549](https://ithelp.ithome.com.tw/articles/10251549)</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z url">[https://www.tpisoftware.com/tpu/articleDetails/1216](https://www.tpisoftware.com/tpu/articleDetails/1216)</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z url">[https://yeasy.gitbook.io/docker\_practice](https://yeasy.gitbook.io/docker_practice)</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z url">[https://blog.techbridge.cc/2018/09/07/docker-compose-tutorial-intro/](https://blog.techbridge.cc/2018/09/07/docker-compose-tutorial-intro/)</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z url">[https://yeasy.gitbook.io/docker\_practice/compose/usage](https://yeasy.gitbook.io/docker_practice/compose/usage)</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z url">[https://dev.to/truthseekers/setup-a-basic-local-php-development-environment-in-docker-kod](https://dev.to/truthseekers/setup-a-basic-local-php-development-environment-in-docker-kod)</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z url">[https://dotblogs.com.tw/explooosion/2018/09/15/194754#2](https://dotblogs.com.tw/explooosion/2018/09/15/194754#2)</span>
- <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z url">[https://dca.gitbooks.io/nodejs-tw-wiki-book/content/book/todo\_list/todo\_list.html](https://dca.gitbooks.io/nodejs-tw-wiki-book/content/book/todo_list/todo_list.html)</span>

<div id="bkmrk--99"></div># <span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z">推薦學習</span>

<div id="bkmrk-https%3A%2F%2Fdev.to%2Fankit"><span class="gallery author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90za3ls0z82zz79zswnpuz79zedberz68za3xz84zz76zqmz83zmz84z1z75z"><span class="gallery-wrapper" data-ace-gallery-clipboard-json="{"items":[{"type":"unfurl","url":"https://dev.to/ankit01oss/7-github-projects-to-supercharge-your-docker-practices-2i80","serializedZonesForClipboard":{"captionZone":{"atext":{"text":"\n","attribs":"|1+1"},"pool":{"numToAttrib":{},"attribToNum":{},"nextNum":0,"dirty":false,"firstDirtyNum":null}}}}]}" data-ace-gallery-urls="https://dev.to/ankit01oss/7-github-projects-to-supercharge-your-docker-practices-2i80">[https://dev.to/ankit01oss/7-github-projects-to-supercharge-your-docker-practices-2i80](https://dev.to/ankit01oss/7-github-projects-to-supercharge-your-docker-practices-2i80)  
</span></span></div>