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/
config.json
sessions/
docker/data/
build/
# Coverage

View file

@ -190,17 +190,17 @@ docker compose -f docker/docker-compose.yml --profile gateway down
```bash
# 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
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
```bash
docker compose -f docker/docker-compose.yml pull
docker compose -f docker/docker-compose.yml --profile gateway up -d
git pull
docker compose -f docker/docker-compose.yml --profile gateway up --build -d
```
### 🚀 Démarrage Rapide

View file

@ -152,17 +152,17 @@ docker compose -f docker/docker-compose.yml --profile gateway down
```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
docker compose -f docker/docker-compose.yml pull
docker compose -f docker/docker-compose.yml --profile gateway up -d
git pull
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
# 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
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
```bash
docker compose -f docker/docker-compose.yml pull
docker compose -f docker/docker-compose.yml --profile gateway up -d
git pull
docker compose -f docker/docker-compose.yml --profile gateway up --build -d
```
### 🚀 Quick Start

View file

@ -191,17 +191,17 @@ docker compose -f docker/docker-compose.yml --profile gateway down
```bash
# 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
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
```bash
docker compose -f docker/docker-compose.yml pull
docker compose -f docker/docker-compose.yml --profile gateway up -d
git pull
docker compose -f docker/docker-compose.yml --profile gateway up --build -d
```
### 🚀 Início Rápido

View file

@ -171,17 +171,17 @@ docker compose -f docker/docker-compose.yml --profile gateway down
```bash
# Đặ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
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
```bash
docker compose -f docker/docker-compose.yml pull
docker compose -f docker/docker-compose.yml --profile gateway up -d
git pull
docker compose -f docker/docker-compose.yml --profile gateway up --build -d
```
### 🚀 Bắt đầu nhanh

View file

@ -192,17 +192,17 @@ docker compose -f docker/docker-compose.yml --profile gateway down
```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
docker compose -f docker/docker-compose.yml pull
docker compose -f docker/docker-compose.yml --profile gateway up -d
git pull
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
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 --from=builder /src/build/picoclaw /usr/local/bin/picoclaw
COPY docker/entrypoint.sh /entrypoint.sh
# Create non-root user and group
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
USER picoclaw
# Run onboard to create initial directories and config
RUN /usr/local/bin/picoclaw onboard
ENTRYPOINT ["picoclaw"]
ENTRYPOINT ["/entrypoint.sh"]
CMD ["gateway"]

View file

@ -1,10 +1,29 @@
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)
# 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:
image: docker.io/sipeed/picoclaw:latest
image: picoclaw-local:dev
build:
context: ..
dockerfile: docker/Dockerfile
container_name: picoclaw-agent
profiles:
- agent
@ -12,17 +31,20 @@ services:
#extra_hosts:
# - "host.docker.internal:host-gateway"
volumes:
- ./data:/root/.picoclaw
entrypoint: ["picoclaw", "agent"]
- ./data:/home/picoclaw/.picoclaw
entrypoint: ["/entrypoint.sh", "agent"]
stdin_open: true
tty: true
# ─────────────────────────────────────────────
# 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:
image: docker.io/sipeed/picoclaw:latest
image: picoclaw-local:dev
build:
context: ..
dockerfile: docker/Dockerfile
container_name: picoclaw-gateway
restart: on-failure
profiles:
@ -31,4 +53,4 @@ services:
#extra_hosts:
# - "host.docker.internal:host-gateway"
volumes:
- ./data:/root/.picoclaw
- ./data:/home/picoclaw/.picoclaw

View file

@ -1,15 +1,22 @@
#!/bin/sh
set -e
# First-run: neither config nor workspace exists.
# If config.json is already mounted but workspace is missing we skip onboard to
# avoid the interactive "Overwrite? (y/n)" prompt hanging in a non-TTY container.
if [ ! -d "${HOME}/.picoclaw/workspace" ] && [ ! -f "${HOME}/.picoclaw/config.json" ]; then
if [ "$#" -eq 0 ]; then
set -- gateway
fi
# 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
echo ""
echo "First-run setup complete."
echo "Edit ${HOME}/.picoclaw/config.json (add your API key, etc.) then restart the container."
exit 0
fi
fi
exec picoclaw gateway "$@"
exec picoclaw "$@"