Upvotes
0
Upvotes: 0我在Windows 11的wsl裡面準備安裝Docker, 但是遇到錯誤:sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin Reading package lists... Done Building dependency tree... Done Reading state information... Done Package docker-ce is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source
E: Package 'docker-ce' has no installation candidate E: Unable to locate package docker-ce-cli E: Unable to locate package containerd.io E: Couldn't find any package by glob 'containerd.io' E: Couldn't find any package by regex 'containerd.io' E: Unable to locate package docker-buildx-plugin E: Unable to locate package docker-compose-plugin
這個錯誤幾乎可以確定是:你還沒把 Docker 官方 apt repository 加進 WSL 裡的 Linux,或加錯發行版來源。docker-ce 這些套件不在 Ubuntu/Debian 預設 apt source 裡,所以 apt 找不到。
如果你的 WSL 是 Ubuntu,照 Docker 官方流程重跑這段:
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
如果你用的是 Debian WSL,把 URL 改成 Debian:
https://download.docker.com/linux/debian
裝好後測試:
sudo docker run hello-world
docker compose version
另外,在 Windows 11 + WSL 上有兩條路:
推薦一般開發用 Docker Desktop + WSL2 integration
Docker 官方也建議 Windows/WSL 使用 Docker Desktop WSL 2 backend。這樣 WSL 裡直接用 docker,daemon 由 Docker Desktop 管。
參考:Docker Desktop WSL 2 backend
完全在 WSL 裡安裝 Docker Engine
就用上面的 apt repository 方式。若 Docker daemon 起不來,可能還要開 WSL 的 systemd。Microsoft 官方方式是在 /etc/wsl.conf 加:
ini
[boot]
systemd=true
然後在 Windows PowerShell 跑:
powershell
wsl --shutdown
參考:Microsoft WSL systemd
Docker Ubuntu 官方安裝文件在這裡:Install Docker Engine on Ubuntu。
我在frontend/.env.local已經將S3的設定檔案建立好了, 但是還是出現錯誤:[message-objects] c0a0bab7-f5bd-4e17-8c3b-a1ac1dc7b991 s3_upload_attempt_failed { label: 'text', attempt: 3, error: { message: 'S3 upload failed with status 403', name: 'Error', code: undefined, causeMessage: undefined, causeCode: undefined, chainText: '#0 Error S3 upload failed with status 403' } }
原因找到了:不是 .env.local 沒讀到,也不是 bucket 名稱第一嫌疑。MinIO 回的真正錯誤是:
<Code>RequestTimeTooSkewed</Code>
<Message>The difference between the request time and the server's time is too large.</Message>
我檢查到時間差約 33 分鐘:
Windows: 2026-06-08T14:26:46+08:00
WSL: 2026-06-08T13:53:02+08:00
S3/MinIO 的簽名會把時間放進 x-amz-date,時間差太大就會直接回 403。很多 S3 相容服務大約只容忍 15 分鐘左右的偏差。
你先在 Windows PowerShell 跑:
wsl --shutdown
然後重新開 WSL,重啟你的 MinIO / Docker container,再重啟 frontend dev server。通常 WSL2 時間漂移用這招就會重新同步。
確認時間用:
Get-Date -Format o
wsl -e sh -lc 'date -u +%Y-%m-%dT%H:%M:%SZ; date +%Y-%m-%dT%H:%M:%S%z'
另外你的 MinIO port 判讀:9000 是 S3 API,9001 是 MinIO Console,所以 S3_ENDPOINT_URL=http://127.0.0.1:9000 目前方向是對的,不要改成 9001。
參考:AWS SDK 也把 RequestTimeTooSkewed 定義為 request time 和 server time 差太大;S3 相容服務通常因此拒絕簽名請求。
AWS RequestTimeTooSkewedException
minIO啟動後, 在bash如何使用指令進行新增bucket 'message-objects'?
在 bash 裡最簡單用 MinIO Client mc:
mc alias set local http://127.0.0.1:9000 minioadmin minioadmin
mc mb --ignore-existing local/message-objects
mc ls local
如果你的帳密不是 minioadmin/minioadmin,改成 .env.local 裡的值:
mc alias set local http://127.0.0.1:9000 "$S3_ACCESS_KEY_ID" "$S3_SECRET_ACCESS_KEY"
mc mb --ignore-existing local/message-objects
如果 bash 裡沒有 mc,但你有 Docker,可以直接跑一次性的 minio/mc:
docker run --rm --network host minio/mc \
mb --ignore-existing http://minioadmin:minioadmin@127.0.0.1:9000/message-objects
或更穩一點:
docker run --rm --network host minio/mc sh -c \
"mc alias set local http://127.0.0.1:9000 minioadmin minioadmin && mc mb --ignore-existing local/message-objects && mc ls local"
建立成功後,你應該會看到 message-objects 出現在 mc ls local。
sudo docker run --rm --network host minio/mc sh -c "mc alias set local http://127.0.0.1:9000 minioadmin minioadmin && mc mb --ignore-existing local/message-objects && mc ls local"
mc: sh is not a recognized command. Get help using --help flag.
Did you mean one of these?
share
minio/mc 這個 image 的 entrypoint 已經是 mc,所以你給的 sh -c 被當成 mc sh,才會出現這個錯誤。
改用這個:
sudo docker run --rm --network host --entrypoint sh minio/mc -c \
"mc alias set local http://127.0.0.1:9000 minioadmin minioadmin && mc mb --ignore-existing local/message-objects && mc ls local"
或分三次跑也可以:
sudo docker run --rm --network host minio/mc \
alias set local http://127.0.0.1:9000 minioadmin minioadmin
sudo docker run --rm --network host minio/mc \
mb --ignore-existing local/message-objects
sudo docker run --rm --network host minio/mc \
ls local
如果 MinIO 不是預設帳密,把 minioadmin minioadmin 換成你的 S3_ACCESS_KEY_ID 和 S3_SECRET_ACCESS_KEY。
james@JamesZenBook:~/minioDocker$ sudo docker run --rm --network host minio/mc \
alias set local http://127.0.0.1:9000 minioadmin minioadmin
Added local successfully.
james@JamesZenBook:~/minioDocker$ sudo docker run --rm --network host minio/mc \
mb --ignore-existing local/message-objects
mc: Unable to make bucket local/message-objects. Access Denied.
james@JamesZenBook:~/minioDocker$ sudo docker run --rm --network host minio/mc \
ls local
mc: Unable to list folder. Access Denied.
你這個狀況有兩個重點:
docker run --rm minio/mc ... 每次都是新 container,前一次 alias set local 不會保留。Access Denied 很可能表示 minioadmin/minioadmin 不是你這台 MinIO 的 root 帳密。先用「同一個 container 內連續執行」:
sudo docker run --rm --network host --entrypoint sh minio/mc -c \
"mc alias set local http://127.0.0.1:9000 minioadmin minioadmin && mc admin info local && mc mb --ignore-existing local/message-objects && mc ls local"
如果還是 Access Denied,先查 MinIO 實際 root 帳密:
sudo docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Ports}}"
找到 MinIO container 名稱後:
sudo docker inspect <minio-container-name> \
--format '{{range .Config.Env}}{{println .}}{{end}}' | grep MINIO
看這兩個值:
MINIO_ROOT_USER=...
MINIO_ROOT_PASSWORD=...
然後改用實際帳密:
sudo docker run --rm --network host --entrypoint sh minio/mc -c \
"mc alias set local http://127.0.0.1:9000 '<MINIO_ROOT_USER>' '<MINIO_ROOT_PASSWORD>' && mc mb --ignore-existing local/message-objects && mc ls local"
如果你是用 docker compose 啟動 MinIO,也可以直接看你的 docker-compose.yml 裡的 MINIO_ROOT_USER / MINIO_ROOT_PASSWORD。
必須使用同一個 container 內連續執行: sudo docker run --rm --network host --entrypoint sh minio/mc -c \ "mc alias set local http://127.0.0.1:9000 minioadmin minioadmin && mc admin info local && mc mb --ignore-existing local/message-objects && mc ls local"