Windows 11 WSL+Docker & MinIO/S3安裝

Votes

Upvotes

0

Upvotes: 0

Downvotes

0

Downvotes: 0

Net votes

+0

Prompt #1

我在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

Response #1

這個錯誤幾乎可以確定是:你還沒把 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 上有兩條路:

  1. 推薦一般開發用 Docker Desktop + WSL2 integration
    Docker 官方也建議 Windows/WSL 使用 Docker Desktop WSL 2 backend。這樣 WSL 裡直接用 docker,daemon 由 Docker Desktop 管。
    參考:Docker Desktop WSL 2 backend

  2. 完全在 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

Prompt #2

我在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' } }

Response #2

原因找到了:不是 .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

Prompt #3

minIO啟動後, 在bash如何使用指令進行新增bucket 'message-objects'?

Response #3

在 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

Prompt #4

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

Response #4

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_IDS3_SECRET_ACCESS_KEY

Prompt #5

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.

Response #5

你這個狀況有兩個重點:

  1. docker run --rm minio/mc ... 每次都是新 container,前一次 alias set local 不會保留。
  2. 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

Comments

Login to add a comment.

JamesCT

必須使用同一個 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"

Net votes 0 (↑0 / ↓0)