ข้ามไปยังเนื้อหา

Docker Build

ตัว builder จัดส่งในรูปแบบ Docker image โดย content repo จะเรียกใช้งานเพื่อสร้าง static HTML โดยไม่ต้องติดตั้ง Node.js หรือ Astro ในเครื่อง

docker/Dockerfile ใช้การ build แบบหลายขั้นตอนบน node:24-alpine:

FROM node:24-alpine AS builder
WORKDIR /app
# Install deps (cached layer)
COPY package*.json ./
RUN npm ci
# Copy framework code
COPY . .
# Remove placeholder content
RUN rm -rf src/content/docs/*
COPY docker/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
เลเยอร์สิ่งที่ทำเหตุผลที่แคชแยกกัน
1COPY package*.json + npm ciDependencies ไม่ค่อยเปลี่ยนแปลง การแคชเลเยอร์นี้ช่วยหลีกเลี่ยงการดาวน์โหลดซ้ำทุกครั้งที่ build
2COPY . .ซอร์สโค้ดของ framework
3rm -rf src/content/docs/*ล้างเนื้อหา placeholder ออก เพื่อให้แสดงเฉพาะเนื้อหาที่ถูก inject เข้ามา
4COPY entrypoint.shสคริปต์จัดการการ build

docker/entrypoint.sh ทำงานทุกครั้งที่ container เริ่มต้น โดยดำเนินการตามขั้นตอนเหล่านี้ตามลำดับ:

Terminal window
npm install
npm update

ทำให้มั่นใจว่า theme package และ dependencies ทั้งหมดเป็นเวอร์ชันล่าสุดที่เข้ากันได้

Terminal window
cp /app/node_modules/@f5-sales-demo/docs-theme/astro.config.mjs /app/astro.config.mjs
cp /app/node_modules/@f5-sales-demo/docs-theme/src/content.config.ts /app/src/content.config.ts

คัดลอก astro.config.mjs และ content.config.ts จาก theme package โดย theme เป็นแหล่งข้อมูลเดียวที่เป็นต้นฉบับสำหรับการตั้งค่า Astro — ดู สถาปัตยกรรม สำหรับการออกแบบระบบ theme

Terminal window
if [ -d "$CONTENT_DIR" ]; then
cp -r "$CONTENT_DIR"/* /app/src/content/docs/
else
echo "ERROR: No content found at $CONTENT_DIR"
exit 1
fi

คัดลอกเนื้อหาที่ mount ไว้เข้าสู่ไดเรกทอรี content collection ของ Astro จะออกพร้อมข้อผิดพลาดหากไม่พบไดเรกทอรีเนื้อหา

Terminal window
if [ -z "$DOCS_TITLE" ] && [ -f /app/src/content/docs/index.mdx ]; then
DOCS_TITLE=$(grep -m1 '^title:' /app/src/content/docs/index.mdx | sed 's/title: *["]*//;s/["]*$//')
export DOCS_TITLE
fi

หาก DOCS_TITLE ไม่ได้ตั้งค่าผ่านตัวแปรสภาพแวดล้อม จะดึงจากฟิลด์ title: ใน frontmatter ของ index.mdx

Terminal window
if [ -z "$DOCS_BASE" ] && [ -n "$GITHUB_REPOSITORY" ]; then
DOCS_BASE="/${GITHUB_REPOSITORY#*/}"
export DOCS_BASE
fi

อนุมาน base path ของเว็บไซต์จากชื่อ GitHub repository (เช่น owner/my-docs จะกลายเป็น /my-docs)

Terminal window
npm run build

เรียกใช้ astro build เพื่อสร้างผลลัพธ์แบบ static ใน /app/dist/

Terminal window
if [ -d "$OUTPUT_DIR" ]; then
cp -r /app/dist/* "$OUTPUT_DIR"/
fi

คัดลอกเว็บไซต์ที่ build แล้วไปยังจุด mount ผลลัพธ์

ตัวแปรค่าเริ่มต้นคำอธิบาย
CONTENT_DIR/content/docsเส้นทางไปยังไดเรกทอรีเนื้อหาที่ mount ไว้
OUTPUT_DIR/outputเส้นทางที่เว็บไซต์ที่ build แล้วจะถูกคัดลอกไป
DOCS_TITLE(ดึงจาก index.mdx)ชื่อเว็บไซต์ที่ส่งไปยังการตั้งค่า Astro
DOCS_DESCRIPTION(ดึงจาก index.mdx)คำอธิบายเว็บไซต์จาก frontmatter
DOCS_BASE(อนุมานจาก GITHUB_REPOSITORY)Base path สำหรับเว็บไซต์ (เช่น /my-docs)
DOCS_SITE(อนุมานจาก GITHUB_REPOSITORY_OWNER)URL ของเว็บไซต์ที่ส่งไปยังการตั้งค่า Astro (เช่น https://<owner>.github.io)
GITHUB_REPOSITORY(ตั้งค่าโดย GitHub Actions)สตริง owner/repo ที่ใช้อนุมาน DOCS_BASE
GENERATE_PDFfalseเปิดใช้งานการสร้าง PDF หลัง build
PDF_FILENAMEdocsชื่อไฟล์ผลลัพธ์สำหรับ PDF ที่สร้างขึ้น
LLMS_OPTIONAL_LINKS[]JSON array ของ URL เว็บไซต์ย่อยสำหรับส่วน Optional ของ llms.txt

ในการ build เอกสารในเครื่องโดยใช้ Docker:

Terminal window
docker run --rm \
-v "$(pwd)/docs:/content/docs" \
-v "$(pwd)/output:/output" \
ghcr.io/f5-sales-demo/docs-builder:latest

คำสั่งนี้จะ mount ไดเรกทอรี docs/ ในเครื่องเป็นเนื้อหา และเขียนเว็บไซต์ที่ build แล้วไปยัง output/

สำหรับผู้เขียนเนื้อหาที่ต้องการเวิร์กโฟลว์ dev server แบบ live ดู การดูตัวอย่างในเครื่องสำหรับผู้เขียนเนื้อหา

เมื่อทำงานกับตัว builder เอง (คอมโพเนนต์, ปลั๊กอิน, การรวม theme) คุณสามารถเรียกใช้ dev server ของ Astro โดยตรงโดยไม่ต้องใช้ Docker:

Terminal window
npm ci
cp node_modules/@f5-sales-demo/docs-theme/astro.config.mjs astro.config.mjs
cp node_modules/@f5-sales-demo/docs-theme/src/content.config.ts src/content.config.ts
# Copy some test content into the content collection
cp -r /path/to/test-content/* src/content/docs/
DOCS_TITLE="Dev Test" npx astro dev --host

เปิด http://localhost:4321 Hot module replacement (HMR) ทำงานได้สำหรับการเปลี่ยนแปลงคอมโพเนนต์และปลั๊กอิน

Image ถูกเผยแพร่ไปยัง GitHub Container Registry:

ghcr.io/f5-sales-demo/docs-builder

มีการ push สองแท็กในทุกการ build:

แท็กคำอธิบาย
latestการ build ล่าสุดจาก main
<sha>SHA ของ Git commit แบบเต็มสำหรับการ build ที่ทำซ้ำได้

ดู CI/CD และการกำกับดูแล สำหรับ workflow ที่ build และเผยแพร่ image