MinIO in Docker Compose

services: minio: image: quay.io/minio/minio command: server /data --console-address :9001 ports: - "9000:9000" - "9001:9001" volumes: - ~/minio/data:/data environment: MINIO_ROOT_USER: ROOTNAME MINIO_ROOT_PASSWORD: CHANGEME123

In Docker Compose, MinIO’s arguments go in command: server /data --console-address :9001. /data has to be the path the volume is mounted at, and --console-address fixes the web console’s port: without it MinIO picks a random one at startup and prints it in the log. The S3 API stays on 9000.

The docker run command, converted

The container quickstart from MinIO’s documentation:

docker run \
   -p 9000:9000 \
   -p 9001:9001 \
   --name minio \
   -v ~/minio/data:/data \
   -e "MINIO_ROOT_USER=ROOTNAME" \
   -e "MINIO_ROOT_PASSWORD=CHANGEME123" \
   quay.io/minio/minio server /data --console-address ":9001"
services:
  minio:
    image: quay.io/minio/minio
    command: server /data --console-address :9001
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - ~/minio/data:/data
    environment:
      MINIO_ROOT_USER: ROOTNAME
      MINIO_ROOT_PASSWORD: CHANGEME123

The shell removed the quotes, so they’re gone from the file. Compose expands ~ to the home directory of whoever runs it.

The image is gone

As of October 2026, neither quay.io/minio/minio nor minio/minio can be pulled: both registries refuse the request. MinIO’s GitHub repository is archived, its README says the community edition is distributed as source code only, and dl.min.io answers 410 for the old binaries. The newest release, RELEASE.2025-10-15T17-29-55Z, has no binaries; RELEASE.2025-09-07T16-13-09Z still has them on GitHub, without the fixes that came after. MinIO’s maintained product, AIStor, needs a license file. To keep running the community server, build the image yourself:

# minio/Dockerfile
FROM alpine:3.22
ARG TARGETARCH
ARG RELEASE=RELEASE.2025-09-07T16-13-09Z
ADD https://github.com/minio/minio/releases/download/${RELEASE}/minio.linux-${TARGETARCH}.${RELEASE} /usr/bin/minio
RUN apk add --no-cache curl && chmod +x /usr/bin/minio
EXPOSE 9000 9001
ENTRYPOINT ["/usr/bin/minio"]
services:
  minio:
    build: ./minio
    image: minio-local:RELEASE.2025-09-07T16-13-09Z
    command: server /data --console-address :9001
    ports:
      - "127.0.0.1:9000:9000"
      - "127.0.0.1:9001:9001"
    volumes:
      - minio-data:/data
    environment:
      MINIO_ROOT_USER: ROOTNAME
      MINIO_ROOT_PASSWORD: CHANGEME123
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 10s
      timeout: 5s
      retries: 5
  app:
    image: example/app:1.0
    environment:
      S3_ENDPOINT: http://minio:9000
    depends_on:
      minio:
        condition: service_healthy
volumes:
  minio-data:

docker compose up -d --build builds it once and tags it with the image: name. /minio/health/live is the liveness probe MinIO documents, and it needs no credentials. The published images shipped curl and mc; a home-built one only has what its Dockerfile adds.

Gotchas

  • MINIO_ROOT_USER needs at least 3 characters and MINIO_ROOT_PASSWORD at least 8, or the server stops with Please provide correct credentials. Without either, the root login is minioadmin/minioadmin.
  • Apps use the API at http://minio:9000; 9001 is only the console.
  • docker compose down -v deletes minio-data, buckets included. The bind mount in the converted file is left alone.

Try it in the docker run to Compose Converter

compose.yaml

1 service · everything carried over

Runs in your browser. Nothing you enter is sent anywhere.