Skip to content

🐳 Docker 部署

Composer Skills 自带 Dockerfiledocker-compose.yml,方便你把 CLI 工具或基于 SDK 的程序容器化。本页基于项目自带的 Docker 文件给出使用说明,并给出多阶段构建建议。

📦 项目自带的 Dockerfile

项目根目录的 Dockerfile 采用多阶段构建,把构建环境与运行环境分离:

dockerfile
# ---- 构建阶段 ----
FROM golang:1.20-alpine AS build
WORKDIR /app
COPY go.mod go.sum* ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o /composer-skills cmd/main.go

# ---- 运行阶段 ----
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=build /composer-skills .
RUN mkdir -p /data
ENV OUTPUT_DIR=/data
ENTRYPOINT ["./composer-skills"]
CMD ["--help"]

要点:

  • 🐹 构建阶段golang:1.20-alpine,编译出静态二进制(CGO_ENABLED=0)。
  • 🪶 运行阶段alpine,只装 ca-certificates 支持 HTTPS,镜像极小。
  • 📁 /data 目录用于挂载输出,环境变量 OUTPUT_DIR=/data

Go 版本对齐

项目 go.mod 声明 go 1.23.0。如果你用自带 Dockerfile 报版本错误,请把基础镜像升到 golang:1.23-alpine。建议复用下文"推荐 Dockerfile"。

🚀 用 Docker 运行

构建镜像:

bash
docker build -t composer-skills .

跑几个常用命令(结果挂载到 ./data):

bash
mkdir -p data

# 统计信息
docker run -v "$(pwd)/data:/data" composer-skills \
    -stats -output /data/statistics.json

# 指定包详情
docker run -v "$(pwd)/data:/data" composer-skills \
    -package symfony/console -output /data/symfony-console.json

# 安全公告
docker run -v "$(pwd)/data:/data" composer-skills \
    -advisories -output /data/advisories.json

纯 Go,无需 PHP

上面这些命令走的是 Packagist API(-stats/-package/-advisories),容器里不需要装 PHP。镜像因此能保持极小。只有要跑本地 composer install/audit 时才需要 PHP。

🐙 用 Docker Compose 运行

项目根目录的 docker-compose.yml 预定义了多个服务,一条命令跑一个任务:

yaml
version: '3'
services:
  composer-skills:        # 获取统计信息
    build: .
    volumes: [./data:/data]
    command: ["-stats"]
  get-package:            # 获取指定包信息
    build: .
    volumes: [./data:/data]
    command: ["-package", "symfony/console", "-output", "/data/symfony-console.json"]
  get-advisories:         # 获取安全公告
    build: .
    volumes: [./data:/data]
    command: ["-advisories", "-output", "/data/advisories.json"]
  popular-packages:       # 运行流行包示例
    build: .
    volumes: [./data:/data]
    entrypoint: ["/bin/sh", "-c"]
    command: |
      cd /app && go build -o /root/popular-packages examples/popular_packages/main.go &&
      cd /root && ./popular-packages
  security-monitor:       # 运行安全监控示例
    build: .
    volumes: [./data:/data]
    entrypoint: ["/bin/sh", "-c"]
    command: |
      cd /app && go build -o /root/security-monitor examples/security_monitor/main.go &&
      cd /root && ./security-monitor

常用操作:

bash
docker-compose up composer-skills     # 统计
docker-compose up get-package         # 包详情
docker-compose up get-advisories      # 安全公告
docker-compose up popular-packages    # 流行包示例
docker-compose up security-monitor    # 安全监控示例

结果落在 ./data 目录。

权限问题

./data 写不进去,调整权限:

bash
chmod -R 777 ./data

📌 自定义运行

想跑别的包或参数,直接覆盖 command

bash
docker run -v "$(pwd)/data:/data" composer-skills \
    -package laravel/framework -output /data/laravel-framework.json

或在 docker-compose.yml 里新增一个服务。

🛠️ 推荐 Dockerfile(对齐 Go 1.23 + 多阶段)

如果你要基于 SDK 写自己的程序,推荐用下面这个对齐 Go 版本的多阶段 Dockerfile:

dockerfile
# ---- 构建阶段 ----
FROM golang:1.23-alpine AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
# 编译你自己的程序,静态链接
RUN CGO_ENABLED=0 GOOS=linux go build -o /app ./ci/main.go

# ---- 运行阶段 ----
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=build /app .
ENTRYPOINT ["./app"]

如果运行阶段需要本地 Composer CLI(要跑 install/audit),改用带 PHP 的运行镜像:

dockerfile
# ---- 运行阶段(需要 PHP + Composer)----
FROM php:8.2-cli
RUN apt-get update && apt-get install -y --no-install-recommends \
    git unzip libzip-dev && docker-php-ext-install zip
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
COPY --from=build /app /usr/local/bin/app
WORKDIR /project
ENTRYPOINT ["app"]

借用官方 Composer 镜像

COPY --from=composer:2 /usr/bin/composer /usr/bin/composer 直接从官方 Composer 镜像复制二进制,省去手动安装。你也可以让 Composer Skills 在容器启动时自动安装,但预装更快。

🧭 下一步

基于 MIT 许可证发布