Fix Docker first-run bootstrap and local compose image

This commit is contained in:
DigitalEagle 2026-02-28 00:54:43 -08:00
parent 2f4f45080b
commit 37a1aead62
10 changed files with 80 additions and 47 deletions

1
.gitignore vendored
View file

@ -18,6 +18,7 @@ cmd/**/workspace
.picoclaw/ .picoclaw/
config.json config.json
sessions/ sessions/
docker/data/
build/ build/
# Coverage # Coverage

View file

@ -190,17 +190,17 @@ docker compose -f docker/docker-compose.yml --profile gateway down
```bash ```bash
# Poser une question # Poser une question
docker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m "Combien font 2+2 ?" docker compose -f docker/docker-compose.yml --profile agent run --rm picoclaw-agent -m "Combien font 2+2 ?"
# Mode interactif # Mode interactif
docker compose -f docker/docker-compose.yml run --rm picoclaw-agent docker compose -f docker/docker-compose.yml --profile agent run --rm picoclaw-agent
``` ```
### Mettre à jour ### Mettre à jour
```bash ```bash
docker compose -f docker/docker-compose.yml pull git pull
docker compose -f docker/docker-compose.yml --profile gateway up -d docker compose -f docker/docker-compose.yml --profile gateway up --build -d
``` ```
### 🚀 Démarrage Rapide ### 🚀 Démarrage Rapide

View file

@ -152,17 +152,17 @@ docker compose -f docker/docker-compose.yml --profile gateway down
```bash ```bash
# 質問を投げる # 質問を投げる
docker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m "What is 2+2?" docker compose -f docker/docker-compose.yml --profile agent run --rm picoclaw-agent -m "What is 2+2?"
# インタラクティブモード # インタラクティブモード
docker compose -f docker/docker-compose.yml run --rm picoclaw-agent docker compose -f docker/docker-compose.yml --profile agent run --rm picoclaw-agent
``` ```
### アップデート ### アップデート
```bash ```bash
docker compose -f docker/docker-compose.yml pull git pull
docker compose -f docker/docker-compose.yml --profile gateway up -d docker compose -f docker/docker-compose.yml --profile gateway up --build -d
``` ```
### 🚀 クイックスタート(ネイティブ) ### 🚀 クイックスタート(ネイティブ)

View file

@ -198,17 +198,17 @@ docker compose -f docker/docker-compose.yml --profile gateway down
```bash ```bash
# Ask a question # Ask a question
docker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m "What is 2+2?" docker compose -f docker/docker-compose.yml --profile agent run --rm picoclaw-agent -m "What is 2+2?"
# Interactive mode # Interactive mode
docker compose -f docker/docker-compose.yml run --rm picoclaw-agent docker compose -f docker/docker-compose.yml --profile agent run --rm picoclaw-agent
``` ```
### Update ### Update
```bash ```bash
docker compose -f docker/docker-compose.yml pull git pull
docker compose -f docker/docker-compose.yml --profile gateway up -d docker compose -f docker/docker-compose.yml --profile gateway up --build -d
``` ```
### 🚀 Quick Start ### 🚀 Quick Start

View file

@ -191,17 +191,17 @@ docker compose -f docker/docker-compose.yml --profile gateway down
```bash ```bash
# Fazer uma pergunta # Fazer uma pergunta
docker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m "Quanto e 2+2?" docker compose -f docker/docker-compose.yml --profile agent run --rm picoclaw-agent -m "Quanto e 2+2?"
# Modo interativo # Modo interativo
docker compose -f docker/docker-compose.yml run --rm picoclaw-agent docker compose -f docker/docker-compose.yml --profile agent run --rm picoclaw-agent
``` ```
### Atualizar ### Atualizar
```bash ```bash
docker compose -f docker/docker-compose.yml pull git pull
docker compose -f docker/docker-compose.yml --profile gateway up -d docker compose -f docker/docker-compose.yml --profile gateway up --build -d
``` ```
### 🚀 Início Rápido ### 🚀 Início Rápido

View file

@ -171,17 +171,17 @@ docker compose -f docker/docker-compose.yml --profile gateway down
```bash ```bash
# Đặt câu hỏi # Đặt câu hỏi
docker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m "2+2 bằng mấy?" docker compose -f docker/docker-compose.yml --profile agent run --rm picoclaw-agent -m "2+2 bằng mấy?"
# Chế độ tương tác # Chế độ tương tác
docker compose -f docker/docker-compose.yml run --rm picoclaw-agent docker compose -f docker/docker-compose.yml --profile agent run --rm picoclaw-agent
``` ```
### Cập nhật ### Cập nhật
```bash ```bash
docker compose -f docker/docker-compose.yml pull git pull
docker compose -f docker/docker-compose.yml --profile gateway up -d docker compose -f docker/docker-compose.yml --profile gateway up --build -d
``` ```
### 🚀 Bắt đầu nhanh ### 🚀 Bắt đầu nhanh

View file

@ -192,17 +192,17 @@ docker compose -f docker/docker-compose.yml --profile gateway down
```bash ```bash
# 提问 # 提问
docker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m "2+2 等于几?" docker compose -f docker/docker-compose.yml --profile agent run --rm picoclaw-agent -m "2+2 等于几?"
# 交互模式 # 交互模式
docker compose -f docker/docker-compose.yml run --rm picoclaw-agent docker compose -f docker/docker-compose.yml --profile agent run --rm picoclaw-agent
``` ```
### 更新镜像 ### 更新镜像
```bash ```bash
docker compose -f docker/docker-compose.yml pull git pull
docker compose -f docker/docker-compose.yml --profile gateway up -d docker compose -f docker/docker-compose.yml --profile gateway up --build -d
``` ```
### 🚀 快速开始 ### 🚀 快速开始

View file

@ -24,20 +24,23 @@ RUN apk add --no-cache ca-certificates tzdata curl
# Health check # Health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget -q --spider http://localhost:18790/health || exit 1 CMD curl -fsS http://localhost:18790/health >/dev/null || exit 1
# Copy binary # Copy binary
COPY --from=builder /src/build/picoclaw /usr/local/bin/picoclaw COPY --from=builder /src/build/picoclaw /usr/local/bin/picoclaw
COPY docker/entrypoint.sh /entrypoint.sh
# Create non-root user and group # Create non-root user and group
RUN addgroup -g 1000 picoclaw && \ RUN addgroup -g 1000 picoclaw && \
adduser -D -u 1000 -G picoclaw picoclaw adduser -D -u 1000 -h /home/picoclaw -G picoclaw picoclaw && \
mkdir -p /home/picoclaw/.picoclaw && \
chown -R picoclaw:picoclaw /home/picoclaw && \
chmod +x /entrypoint.sh
ENV HOME=/home/picoclaw
# Switch to non-root user # Switch to non-root user
USER picoclaw USER picoclaw
# Run onboard to create initial directories and config ENTRYPOINT ["/entrypoint.sh"]
RUN /usr/local/bin/picoclaw onboard
ENTRYPOINT ["picoclaw"]
CMD ["gateway"] CMD ["gateway"]

View file

@ -1,10 +1,29 @@
services: services:
# ─────────────────────────────────────────────
# PicoClaw Init (one-shot bootstrap)
# docker compose -f docker/docker-compose.yml --profile init run --rm picoclaw-init
# ─────────────────────────────────────────────
picoclaw-init:
image: picoclaw-local:dev
build:
context: ..
dockerfile: docker/Dockerfile
container_name: picoclaw-init
profiles:
- init
volumes:
- ./data:/home/picoclaw/.picoclaw
command: ["onboard"]
# ───────────────────────────────────────────── # ─────────────────────────────────────────────
# PicoClaw Agent (one-shot query) # PicoClaw Agent (one-shot query)
# docker compose -f docker/docker-compose.yml run --rm picoclaw-agent -m "Hello" # docker compose -f docker/docker-compose.yml --profile agent run --rm picoclaw-agent -m "Hello"
# ───────────────────────────────────────────── # ─────────────────────────────────────────────
picoclaw-agent: picoclaw-agent:
image: docker.io/sipeed/picoclaw:latest image: picoclaw-local:dev
build:
context: ..
dockerfile: docker/Dockerfile
container_name: picoclaw-agent container_name: picoclaw-agent
profiles: profiles:
- agent - agent
@ -12,17 +31,20 @@ services:
#extra_hosts: #extra_hosts:
# - "host.docker.internal:host-gateway" # - "host.docker.internal:host-gateway"
volumes: volumes:
- ./data:/root/.picoclaw - ./data:/home/picoclaw/.picoclaw
entrypoint: ["picoclaw", "agent"] entrypoint: ["/entrypoint.sh", "agent"]
stdin_open: true stdin_open: true
tty: true tty: true
# ───────────────────────────────────────────── # ─────────────────────────────────────────────
# PicoClaw Gateway (Long-running Bot) # PicoClaw Gateway (Long-running Bot)
# docker compose -f docker/docker-compose.yml up picoclaw-gateway # docker compose -f docker/docker-compose.yml --profile gateway up picoclaw-gateway
# ───────────────────────────────────────────── # ─────────────────────────────────────────────
picoclaw-gateway: picoclaw-gateway:
image: docker.io/sipeed/picoclaw:latest image: picoclaw-local:dev
build:
context: ..
dockerfile: docker/Dockerfile
container_name: picoclaw-gateway container_name: picoclaw-gateway
restart: on-failure restart: on-failure
profiles: profiles:
@ -31,4 +53,4 @@ services:
#extra_hosts: #extra_hosts:
# - "host.docker.internal:host-gateway" # - "host.docker.internal:host-gateway"
volumes: volumes:
- ./data:/root/.picoclaw - ./data:/home/picoclaw/.picoclaw

View file

@ -1,15 +1,22 @@
#!/bin/sh #!/bin/sh
set -e set -e
# First-run: neither config nor workspace exists. if [ "$#" -eq 0 ]; then
# If config.json is already mounted but workspace is missing we skip onboard to set -- gateway
# avoid the interactive "Overwrite? (y/n)" prompt hanging in a non-TTY container. fi
if [ ! -d "${HOME}/.picoclaw/workspace" ] && [ ! -f "${HOME}/.picoclaw/config.json" ]; then
# First-run bootstrap for non-interactive Docker execution.
# We key off config.json because `picoclaw onboard` only prompts when the config
# already exists. This also repairs partial states where the workspace exists
# but config.json was never created.
if [ "$1" = "gateway" ] || [ "$1" = "agent" ]; then
if [ ! -f "${HOME}/.picoclaw/config.json" ]; then
picoclaw onboard picoclaw onboard
echo "" echo ""
echo "First-run setup complete." echo "First-run setup complete."
echo "Edit ${HOME}/.picoclaw/config.json (add your API key, etc.) then restart the container." echo "Edit ${HOME}/.picoclaw/config.json (add your API key, etc.) then restart the container."
exit 0 exit 0
fi
fi fi
exec picoclaw gateway "$@" exec picoclaw "$@"