發表文章

目前顯示的是有「Dockerfile」標籤的文章

Docker Skills 初探

English Abstract: Docker has published its first official skills for AI coding agents at github.com/docker/skills. The collection follows the open Agent Skills format, so the same SKILL.md directories work in Claude Code, Codex, Cursor, Gemini CLI and GitHub Copilot CLI. This post walks through what the twelve skills cover, how to install them, what a skill actually contains using docker-build-strategies and docker-destructive-guardrails as examples, the release engineering behind the repository, and how to verify that an agent is really applying the rules. The project is still at version 0.x and several skills are marked experimental. Docker 在 2026 年 9 月推出 Docker Skills,寫成 Agent 能直接載入的技能包。本文介紹 Docker Skills 的內容、安裝方式、一個 skill 實際長什麼樣子,以及如何驗證 Agent 真的照著做。 版本說明:本文依據 2026 年 10 月下旬的 repository 內容撰寫。Docker Skills 於 2026-09-22 發布 0.1.0,撰文時最新正式版為 0.3.1,仍在 0.x 階段,部分 skill 標示 experimental,指令與結構可能變動,請以官方文件為準。 (一)Docker Skills 是什麼 Docker Skills 是 Docker 官方維護的一組「知識型 skill」,原始碼放在 github....

Tips on Dockerfile

Dockerfile 看似簡單,幾行 FROM、RUN、COPY 就能把應用打包成 image,但寫得好不好,直接牽動 build 速度、image 大小、安全性與日後的可維護性。本文整理幾個實務中最常用、卻也最常被忽略的 Dockerfile 撰寫訣竅。 (一)善用 layer cache , 指令由 變動較少 排到 容易變化 (由上到下) Docker build 是逐層(layer)快取的,只要某一層的指令或內容改變,該層之後的所有 layer 都會失效重建。因此在Dockerfile內容中,指令順序(由上到下)應該從「變動頻率低」排到「變動頻率高」。最典型的例子,是先複製相依清單、安裝套件,最後才複製原始碼: # 先處理相依,讓 cache 命中率最大化 COPY package.json package-lock.json ./ RUN npm ci COPY . . 如此一來,只要原始碼變動、相依沒變, npm ci 這一層就能命中 cache,不必重跑。 (二)用 multi-stage build 縮小 image 把「編譯環境」與「執行環境」分開,只把最終產物帶進 runtime image,可大幅縮小體積,也降低受攻擊面(attack surface): FROM golang:1.22 AS builder WORKDIR /app COPY . . RUN go build -o server . FROM alpine:3.20 COPY --from=builder /app/server /server ENTRYPOINT ["/server"] runtime image 不再包含 compiler 與原始碼,從數百 MB 降到數十 MB 是常態。 (三)合併 RUN 並在同一層清理 cache 每一個 RUN 都是一層。把相關指令用 && 串接成一層,並在同一層清掉套件快取,避免多餘體積殘留在 image 裡: RUN apk add --no-cache curl \ && rm -rf /var/cache/apk/* Debian/Ubuntu 則常見 apt-get install 之後接 rm -rf /var/l...

Windows Container 有時候無法成功運行

圖片
這篇文章記錄關於 Windows container 運行時會出現的問題。是一個典型的  ASP.NET 應用程式,在編寫 Dockerfile 建置出 image 過程沒有問題。但是在用 docker run 運行此 image 的時候,出現如下圖內容 2 行 錯誤訊息, (註: quesry 應是錯字,正確拼法是 query) ERROR: Failed to stop or quesry status of service 'w3svc' error failed to resize tty, using default size 且 container 在系統上無法建立,應用程式無法運行, 這樣的錯誤並不是每次都發生,有時候會發生錯誤, 運行環境: Windows Server 2016 環境下, (10.0.14393) Docker engine  版本 18.09.8 (1) 關於錯誤訊息, “failed to resize tty, using default size ” 後來發現修改其 Dockerfile 內容中有關 COPY 指令的形式可以解決這部分。 原本是在 Dockerfile 用如下 COPY 形式 COPY ["<src>", "<dest>"] 改爲下列這種形式 COPY <src> <dest> 就不會有 “failed to resize tty ... ” 錯誤訊息。 (2) 關於錯誤訊息, "ERROR: Failed to stop or quesry status of service 'w3svc' error" 目前爲止尚未確定。目前看到的問題可能是由於重複建立使用同一個 container 名字所導致,可以在運行時嘗試建立用不同的 container 名字,並且定期用 docker container prune 清理未在運行狀態的 container。 [參考資料] https://docs.docker.com/engine/reference/builder/#copy

Docker 環境下的 Proxy 配置

關於 Docker 環境下的 Proxy 配置,需要先根據問題具體情況分辨配置方法,有兩種:一個是 docker daemon 的配置,這主要是為了能讓 docker host 通過 proxy server 使用 docker pull/docker run 存取遠端 registry;另一個是 docker client 為了建置 image 或運行 container 的時候所需要的網路配置。 首先快速回顧一下 Linux 作業系統中命令行環境的 proxy 配置方法,以 CentOS 系統環境為例,假設一台 HTTPS proxy server 位在 192.168.1.34 而且 port 是 3128: # environment variables for https proxy # export https_proxy="https://192.168.1.34:3128/" 如果 Proxy server 需要輸入帳號密碼,則用下面這樣的形式 # Https proxy with authentication # export https_proxy="https://username:password@192.168.1.34:3128/" 之後 ping 8.8.8.8 看看Internet是否有連通,可以的話就可在 shell 環境下使用軟體包管理器像是 yum, apt-get 等等,安裝新的軟體,但是,同樣的作業系統環境變數設定對於 Docker 引擎不起作用。 Docker 環境下的 Proxy 配置,根據問題具體情況分為 docker daemon 以及 docker client 的配置,下面分別詳細說明。以下方法可適用在 Docker CE 或 Docker EE 17.06 以上的版本。 (一)Docker daemon 的 proxy 配置 如果 Docker host 處於 air-gapped 的環境下,需要先配置 proxy 才能連到 Internet,否則直接用 docker pull 或相關的命令從遠端 registry 來存取 docker images 會遭遇失敗。 以 CentOS,RedHat, Debian, Ub...

熱門文章

Docker 環境下的 Proxy 配置