├── setups ├── rancher-desktop-dockerd-m1.md ├── docker-desktop-intel.md ├── docker-desktop-m1.md ├── ubuntu-amd64.md ├── podman-m1.md ├── colima-m1.md ├── minikube-hyperkit-m1.sh ├── minikube-docker-desktop-m1.sh ├── minikube-docker-desktop-m1.md ├── minikube-hyperkit-m1.md ├── podman-m1.sh └── colima-m1.sh ├── .github └── workflows │ └── run-docker-tests.yml ├── tests ├── t1.sh ├── t2.sh ├── t6.sh ├── t5.sh ├── t3.sh └── t4.sh ├── LICENSE ├── run-tests.sh └── README.md /setups/rancher-desktop-dockerd-m1.md: -------------------------------------------------------------------------------- 1 | # rancher-desktop dockerd m1 setup for state-of-docker-on-m1 2 | 3 | 4 | ## installation steps 5 | 6 | Steps: 7 | 8 | 1. install docker for mac https://docs.rancherdesktop.io/installation 9 | 2. as container runtime choose "dockerd" -------------------------------------------------------------------------------- /.github/workflows/run-docker-tests.yml: -------------------------------------------------------------------------------- 1 | name: Run Tests on Ubuntu 2 | 3 | on: 4 | push 5 | 6 | 7 | jobs: 8 | 9 | build: 10 | 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v2 15 | - name: Run Tests 16 | run: sh run-tests.sh 17 | -------------------------------------------------------------------------------- /setups/docker-desktop-intel.md: -------------------------------------------------------------------------------- 1 | # docker-desktop intel setup for state-of-docker-on-m1 2 | 3 | This is of course not an m1 macbook setup. But it describes how the reference macbook intel is installed with docker 4 | desktop. 5 | 6 | ## installation steps 7 | 8 | Steps: 9 | 10 | 1. install docker for mac https://docs.docker.com/desktop/mac/install/ 11 | -------------------------------------------------------------------------------- /tests/t1.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if [ "$1" = "description" ] 4 | then 5 | echo "trusty openresty amd64 image" 6 | exit 0 7 | fi 8 | 9 | if [ ! `which docker` ] 10 | then 11 | exit 1; 12 | fi 13 | 14 | docker run --platform linux/amd64 --rm openresty/openresty:1.13.6.1-2-trusty nginx -t 2>&1 | grep "error" > /dev/null 15 | 16 | if [ "$?" = "0" ] 17 | then 18 | exit 1; 19 | fi -------------------------------------------------------------------------------- /tests/t2.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if [ "$1" = "description" ] 4 | then 5 | echo "alpine openresty amd64 image" 6 | exit 0 7 | fi 8 | 9 | if [ ! `which docker` ] 10 | then 11 | exit 1; 12 | fi 13 | 14 | docker run --platform linux/amd64 --rm openresty/openresty:1.19.9.1-5-alpine nginx -t 2>&1 | grep "error" > /dev/null 15 | 16 | if [ "$?" = "0" ] 17 | then 18 | exit 1; 19 | fi -------------------------------------------------------------------------------- /setups/docker-desktop-m1.md: -------------------------------------------------------------------------------- 1 | # docker-desktop m1 setup for state-of-docker-on-m1 2 | 3 | 4 | ## installation steps 5 | 6 | Steps: 7 | 8 | 1. install docker for mac https://docs.docker.com/desktop/mac/install/ 9 | 2. activate "rosetta 2" emulator for amd64 10 | 11 | ```console 12 | $ softwareupdate --install-rosetta 13 | ``` 14 | 15 | ## uninstall steps 16 | 17 | 18 | Remove from "~/.docker/config.json" the key value 19 | 20 | ``` 21 | "credsStore" : "desktop", 22 | ``` -------------------------------------------------------------------------------- /setups/ubuntu-amd64.md: -------------------------------------------------------------------------------- 1 | # ubuntu amd64 for state-of-docker-on-m1 2 | 3 | This is of course not an m1 and not a macbook setup. But it describes how the reference runner is installed. 4 | 5 | ## installation steps 6 | 7 | Steps: 8 | 9 | 1. setup an ubuntu docker "focal version" 10 | 2. install docker 11 | 3. validate setup 12 | ``` 13 | Distributor ID: Ubuntu 14 | Description: Ubuntu 20.04.3 LTS 15 | Release: 20.04 16 | Codename: focal 17 | ``` -------------------------------------------------------------------------------- /setups/podman-m1.md: -------------------------------------------------------------------------------- 1 | # podman setup for state-of-docker-on-m1 2 | 3 | ## installation steps 4 | 5 | The steps are included in [podman-m1.sh](./podman-m1.sh). 6 | 7 | Steps: 8 | 9 | 1. Homebrew 10 | 2. Install podman with Brew 11 | 3. Init Podman VM 12 | 4. Start Podman VM 13 | 5. Symlink docker cli to podman cli 14 | 15 | ## Uninstall steps 16 | 17 | 1. Stop and delete podman vm 18 | 19 | ```console 20 | $ podman machine stop 21 | $ podman machine rm --force 22 | ``` 23 | 24 | 2. Uninstall 25 | 26 | ```console 27 | $ brew uninstall podman 28 | ``` 29 | 30 | 3. Remove docker symlink 31 | 32 | ```console 33 | $ rm /usr/local/bin/docker 34 | ``` -------------------------------------------------------------------------------- /setups/colima-m1.md: -------------------------------------------------------------------------------- 1 | # colima setup for state-of-docker-on-m1 2 | 3 | ## installation steps 4 | 5 | The steps are included in [colima-m1.sh](./colima-m1.sh). 6 | 7 | Steps: 8 | 9 | 1. Homebrew 10 | 2. Docker CLI with Brew 11 | 3. Colima with Brew 12 | 4. Docker-Compose with Brew 13 | 5. Launch Colima VM 14 | 6. Install binfmt (amd64 emulator) into Docker 15 | 16 | ## Uninstall steps 17 | 18 | 1. Stop colima vm 19 | 20 | ```console 21 | $ colima stop 22 | ``` 23 | 24 | 2. Uninstall 25 | 26 | ```console 27 | $ brew uninstall colima docker-compose docker 28 | ``` 29 | -------------------------------------------------------------------------------- /setups/minikube-hyperkit-m1.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | if [ ! `which brew` ] 6 | then 7 | echo "Install brew" 8 | 9 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 10 | echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.profile 11 | eval "$(/opt/homebrew/bin/brew shellenv)" 12 | else 13 | echo "Skip brew, because already available" 14 | fi 15 | 16 | if [ ! `which minikube` ] 17 | then 18 | echo "Install minikube" 19 | brew install minikube 20 | else 21 | echo "Skip minikube, because already available" 22 | fi 23 | 24 | IS_MINIKUBE_NOT_RUNNING=`minikube status | grep "minikube start" || true` 25 | if [ "$IS_MINIKUBE_NOT_RUNNING" ] 26 | then 27 | echo "Start minikube vm" 28 | minikube start --driver=hyperkit --no-kubernetes=true 29 | else 30 | echo "Skip starting of minikube vm, because already running" 31 | fi -------------------------------------------------------------------------------- /setups/minikube-docker-desktop-m1.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | if [ ! `which brew` ] 6 | then 7 | echo "Install brew" 8 | 9 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 10 | echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.profile 11 | eval "$(/opt/homebrew/bin/brew shellenv)" 12 | else 13 | echo "Skip brew, because already available" 14 | fi 15 | 16 | if [ ! `which minikube` ] 17 | then 18 | echo "Install minikube" 19 | brew install minikube 20 | else 21 | echo "Skip minikube, because already available" 22 | fi 23 | 24 | brew upgrade minikube 25 | 26 | IS_MINIKUBE_NOT_RUNNING=`minikube status | grep "minikube start" || true` 27 | if [ "$IS_MINIKUBE_NOT_RUNNING" ] 28 | then 29 | echo "Start minikube vm" 30 | minikube start --driver=docker --no-kubernetes=true 31 | else 32 | echo "Skip starting of minikube vm, because already running" 33 | fi -------------------------------------------------------------------------------- /setups/minikube-docker-desktop-m1.md: -------------------------------------------------------------------------------- 1 | # minikube docker desktop m1 setup for state-of-docker-on-m1 2 | 3 | ## installation steps 4 | 5 | Manual Steps: 6 | 7 | 1. install docker for mac https://docs.docker.com/desktop/mac/install/ 8 | 2. Manually install "XCode" in App Store 9 | 3. Install rosetta 2 10 | 11 | ``` 12 | $ softwareupdate --install-rosetta 13 | ``` 14 | 15 | Automated Steps: 16 | 17 | The automated steps (after installing xcode manually via app store) are included in [minikube-docker-desktop-m1.sh](./minikube-docker-desktop-m1.sh). 18 | 19 | 1. Homebrew 20 | 2. Install "Rosetta 2" 21 | 4. Install minikube 22 | 5. Launch minikube VM 23 | 6. Configure docker cli 24 | 25 | ```console 26 | $ eval $(minikube -p minikube docker-env) 27 | ``` 28 | 29 | ## Uninstall steps 30 | 31 | 1. Stop minikube vm 32 | 33 | ```console 34 | $ minikube delete 35 | ``` 36 | 37 | 2. Uninstall 38 | 39 | ```console 40 | $ brew uninstall minikube 41 | ``` -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | state-of-docker-m1 is licensed under the terms of MIT License. 2 | 3 | Copyright (c) 2022 by DracoBlue (JanS@DracoBlue.de) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /setups/minikube-hyperkit-m1.md: -------------------------------------------------------------------------------- 1 | # minikube hyperkit m1 setup for state-of-docker-on-m1 2 | 3 | IMPORTANT 2022-01-29: ⚠️ Hyperkit is not supported on non-x86-systems as of https://github.com/moby/hyperkit/issues/310. 4 | 5 | ```console 6 | $ minikube start --driver=hyperkit --no-kubernetes=true 7 | minikube v1.25.1 on Darwin 12.1 (arm64) 8 | ▪ MINIKUBE_ACTIVE_DOCKERD=minikube 9 | ✨ Using the hyperkit driver based on user configuration 10 | 11 | ❌ Exiting due to DRV_UNSUPPORTED_OS: The driver 'hyperkit' is not supported on darwin/arm64 12 | ``` 13 | 14 | ## installation steps 15 | 16 | Manual Steps: 17 | 18 | 1. Manually install "XCode" in App Store 19 | 20 | Automated Steps: 21 | 22 | The automated steps (after installing xcode manually via app store) are included in [minikube-hyperkit-m1.sh](./podman-m1.sh). 23 | 24 | 1. Homebrew 25 | 3. Install hyperkit 26 | 4. Install minikube 27 | 5. Launch minikube VM 28 | 6. Configure docker cli 29 | 30 | ```console 31 | $ eval $(minikube -p minikube docker-env) 32 | ``` 33 | 7. Install binfmt (am64 emulator) into Docker 34 | 35 | ## Uninstall steps 36 | 37 | 1. Stop colima vm 38 | 39 | ```console 40 | $ minikube stop 41 | ``` 42 | 43 | 2. Uninstall 44 | 45 | ```console 46 | $ brew uninstall colima docker-compose docker 47 | ``` -------------------------------------------------------------------------------- /tests/t6.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if [ "$1" = "description" ] 4 | then 5 | echo "no error like 'l: applet not found'" 6 | exit 0 7 | fi 8 | 9 | if [ "$1" = "expected" ] 10 | then 11 | echo "Expected Success: \n" 12 | cat <<-'EXPECTED_SUCCESS' 13 | total 36 14 | drwxr-xr-x 2 root root 12288 Jul 29 01:32 bin 15 | drwxr-xr-x 5 root root 340 Aug 14 21:59 dev 16 | drwxr-xr-x 1 root root 4096 Aug 14 21:59 etc 17 | drwxr-xr-x 2 nobody nobody 4096 Jul 29 01:32 home 18 | dr-xr-xr-x 246 root root 0 Aug 14 21:59 proc 19 | drwx------ 2 root root 4096 Jul 29 01:32 root 20 | dr-xr-xr-x 13 root root 0 Aug 14 21:59 sys 21 | drwxrwxrwt 2 root root 4096 Jul 29 01:32 tmp 22 | drwxr-xr-x 3 root root 4096 Jul 29 01:32 usr 23 | drwxr-xr-x 4 root root 4096 Jul 29 01:32 var 24 | EXPECTED_SUCCESS 25 | echo "\nExpected Error: \n" 26 | cat <<-'EXPECTED_ERROR' 27 | l: applet not found 28 | EXPECTED_ERROR 29 | exit 0; 30 | fi 31 | 32 | if [ ! `which docker` ] 33 | then 34 | exit 1; 35 | fi 36 | 37 | docker run --rm --platform linux/amd64 --entrypoint ls busybox -l / 2>&1 | cat - | grep "applet not found" > /dev/null 38 | 39 | if [ "$?" = "0" ] 40 | then 41 | exit 1; 42 | fi 43 | -------------------------------------------------------------------------------- /tests/t5.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if [ "$1" = "description" ] 4 | then 5 | echo "varnish 6.0.10 image" 6 | exit 0 7 | fi 8 | 9 | if [ "$1" = "expected" ] 10 | then 11 | echo "Expected Success: \n" 12 | cat <<-'EXPECTED_SUCCESS' 13 | Warnings: 14 | VCL compiled. 15 | 16 | Debug: Version: varnish-6.0.10 revision 9a7da4ff4c0c824af33e230740a11e99fdca23d9 17 | Debug: Platform: Linux,3.13.0-117-generic,x86_64,-junix,-smalloc,-sdefault,-hcritbit 18 | Debug: Child (19) Started 19 | Info: Child (19) said Child starts 20 | EXPECTED_SUCCESS 21 | echo "\nExpected Error: \n" 22 | cat <<-'EXPECTED_ERROR' 23 | Error: 24 | Message from VCC-compiler: 25 | Assert error in vju_subproc(), mgt/mgt_jail_unix.c line 212: 26 | Condition((initgroups(vju_user, vju_gid)) == 0) not true. 27 | errno = 1 (Operation not permitted) 28 | Running VCC-compiler failed, signal 6 29 | VCL compilation failed 30 | EXPECTED_ERROR 31 | exit 0; 32 | fi 33 | 34 | if [ ! `which docker` ] 35 | then 36 | exit 1; 37 | fi 38 | 39 | TEMP_FILE=$(mktemp) 40 | 41 | docker run --platform linux/amd64 --rm varnish:6.0.10 -F 2>&1 | cat - > $TEMP_FILE & 42 | 43 | sleep 10 44 | 45 | kill %1 || true 46 | 47 | cat $TEMP_FILE | grep "Operation not permitted" > /dev/null 48 | 49 | if [ "$?" = "0" ] 50 | then 51 | rm $TEMP_FILE 52 | exit 1; 53 | fi 54 | 55 | rm $TEMP_FILE 56 | -------------------------------------------------------------------------------- /setups/podman-m1.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | if [ ! `which brew` ] 6 | then 7 | echo "Install brew" 8 | 9 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 10 | echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.profile 11 | eval "$(/opt/homebrew/bin/brew shellenv)" 12 | else 13 | echo "Skip brew, because already available" 14 | fi 15 | 16 | if [ ! `which podman` ] 17 | then 18 | echo "Install podman" 19 | brew install podman 20 | else 21 | echo "Skip podman, because already available" 22 | fi 23 | 24 | echo "upgrade podman version (if available)" 25 | brew upgrade podman 26 | 27 | IS_PODMAN_MACHINE_RUNNING=`podman machine list 2>&1 | grep "podman-machine-default" || true` 28 | if [ "$IS_PODMAN_MACHINE_RUNNING" ] 29 | then 30 | echo "Skip initializing of podman machine, because already initialized" 31 | else 32 | echo "Initialize podman machine vm" 33 | podman machine init --cpus 4 --memory 8192 34 | fi 35 | 36 | IS_PODMAN_MACHINE_NOT_RUNNING=`podman system info 2>&1 | grep "podman machine start" || true` 37 | if [ "$IS_PODMAN_MACHINE_NOT_RUNNING" ] 38 | then 39 | echo "Start podman machine vm" 40 | podman machine start 41 | else 42 | echo "Skip starting of podman machine, because already running" 43 | fi 44 | 45 | IS_DOCKER_CLI_ALREADY_PODMAN=`docker help | grep "URL to access Podman service" || true` 46 | if [ "$IS_DOCKER_CLI_ALREADY_PODMAN" ] 47 | then 48 | echo "Skip symlinking podman as docker cli, because is already podman" 49 | else 50 | echo "Symlink /usr/local/bin/docker to `which podman`" 51 | rm /usr/local/bin/docker 52 | ln -s `which podman` /usr/local/bin/docker 53 | fi -------------------------------------------------------------------------------- /setups/colima-m1.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | if [ ! `which brew` ] 6 | then 7 | echo "Install brew" 8 | 9 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 10 | echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.profile 11 | eval "$(/opt/homebrew/bin/brew shellenv)" 12 | else 13 | echo "Skip brew, because already available" 14 | fi 15 | 16 | if [ ! `which docker` ] 17 | then 18 | echo "Install docker" 19 | brew install docker 20 | else 21 | echo "Skip docker (cli) install, because already available" 22 | fi 23 | 24 | if [ ! `which colima` ] 25 | then 26 | echo "Install colima" 27 | brew install colima 28 | else 29 | echo "Skip colima install, because already available" 30 | fi 31 | 32 | if [ ! `which docker-compose` ] 33 | then 34 | echo "Install docker-compose" 35 | brew install docker-compose 36 | else 37 | echo "Skip docker-compose install, because already available" 38 | fi 39 | 40 | echo "perform colima, docker and docker-compose upgrade (if available)" 41 | brew upgrade colima docker docker-compose 42 | 43 | IS_COLIMA_NOT_RUNNING=`colima status 2>&1 | grep "not running" || true` 44 | if [ "$IS_COLIMA_NOT_RUNNING" ] 45 | then 46 | echo "Start colima vm" 47 | colima start --runtime docker --cpu 4 --memory 8 48 | else 49 | echo "Skip starting of colima vm, because already running" 50 | fi 51 | 52 | IS_COLIMA_AMD64_EMULATOR_RUNNING=`docker run --privileged --rm tonistiigi/binfmt | grep linux/amd64 || true` 53 | if [ "$IS_COLIMA_AMD64_EMULATOR_RUNNING" ] 54 | then 55 | echo "Skip starting of amd64 emulator, because already running" 56 | else 57 | echo "Start amd64 emulator in docker" 58 | docker run --privileged --rm tonistiigi/binfmt --install amd64 59 | fi -------------------------------------------------------------------------------- /tests/t3.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if [ "$1" = "description" ] 4 | then 5 | echo "old stern amd64 image " 6 | exit 0 7 | fi 8 | 9 | if [ "$1" = "expected" ] 10 | then 11 | echo "Expected Success: \n" 12 | cat <<-'EXPECTED_SUCCESS' 13 | version: 1.11.0 14 | EXPECTED_SUCCESS 15 | echo "\nExpected Error: \n" 16 | cat <<-'EXPECTED_ERROR' 17 | runtime: failed to create new OS thread (have 2 already; errno=22) 18 | fatal error: newosproc 19 | 20 | runtime stack: 21 | runtime.throw(0x116441c, 0x9) 22 | /usr/local/go/src/runtime/panic.go:596 +0x95 23 | runtime.newosproc(0xc420022000, 0xc420032000) 24 | /usr/local/go/src/runtime/os_linux.go:163 +0x18c 25 | runtime.newm(0x11e0148, 0x0) 26 | /usr/local/go/src/runtime/proc.go:1628 +0x137 27 | runtime.main.func1() 28 | /usr/local/go/src/runtime/proc.go:126 +0x36 29 | runtime.systemstack(0x18ba900) 30 | /usr/local/go/src/runtime/asm_amd64.s:327 +0x79 31 | runtime.mstart() 32 | /usr/local/go/src/runtime/proc.go:1132 33 | 34 | goroutine 1 [running]: 35 | runtime.systemstack_switch() 36 | /usr/local/go/src/runtime/asm_amd64.s:281 fp=0xc42001e788 sp=0xc42001e780 37 | runtime.main() 38 | /usr/local/go/src/runtime/proc.go:127 +0x6c fp=0xc42001e7e0 sp=0xc42001e788 39 | runtime.goexit() 40 | /usr/local/go/src/runtime/asm_amd64.s:2197 +0x1 fp=0xc42001e7e8 sp=0xc42001e7e0 41 | EXPECTED_ERROR 42 | exit 0; 43 | fi 44 | 45 | if [ ! `which docker` ] 46 | then 47 | exit 1; 48 | fi 49 | 50 | docker run --platform linux/amd64 --rm alpine:latest sh -c 'cd /tmp/ && wget https://github.com/wercker/stern/releases/download/1.11.0/stern_linux_amd64 -q && chmod +x stern_linux_amd64 && ./stern_linux_amd64 --version' 2>&1 | grep 'failed to create new OS thread' > /dev/null 51 | 52 | if [ "$?" = "0" ] 53 | then 54 | exit 1; 55 | fi -------------------------------------------------------------------------------- /tests/t4.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if [ "$1" = "description" ] 4 | then 5 | echo "current stern amd64 image " 6 | exit 0 7 | fi 8 | 9 | if [ "$1" = "expected" ] 10 | then 11 | echo "Expected Success: \n" 12 | cat <<-'EXPECTED_SUCCESS' 13 | version: 1.21.0 14 | EXPECTED_SUCCESS 15 | echo "\nExpected Error: \n" 16 | cat <<-'EXPECTED_ERROR' 17 | runtime: failed to create new OS thread (have 2 already; errno=22) 18 | fatal error: newosproc 19 | 20 | runtime stack: 21 | runtime.throw(0x116441c, 0x9) 22 | /usr/local/go/src/runtime/panic.go:596 +0x95 23 | runtime.newosproc(0xc420022000, 0xc420032000) 24 | /usr/local/go/src/runtime/os_linux.go:163 +0x18c 25 | runtime.newm(0x11e0148, 0x0) 26 | /usr/local/go/src/runtime/proc.go:1628 +0x137 27 | runtime.main.func1() 28 | /usr/local/go/src/runtime/proc.go:126 +0x36 29 | runtime.systemstack(0x18ba900) 30 | /usr/local/go/src/runtime/asm_amd64.s:327 +0x79 31 | runtime.mstart() 32 | /usr/local/go/src/runtime/proc.go:1132 33 | 34 | goroutine 1 [running]: 35 | runtime.systemstack_switch() 36 | /usr/local/go/src/runtime/asm_amd64.s:281 fp=0xc42001e788 sp=0xc42001e780 37 | runtime.main() 38 | /usr/local/go/src/runtime/proc.go:127 +0x6c fp=0xc42001e7e0 sp=0xc42001e788 39 | runtime.goexit() 40 | /usr/local/go/src/runtime/asm_amd64.s:2197 +0x1 fp=0xc42001e7e8 sp=0xc42001e7e0 41 | EXPECTED_ERROR 42 | exit 0; 43 | fi 44 | 45 | if [ ! `which docker` ] 46 | then 47 | exit 1; 48 | fi 49 | 50 | docker run --platform linux/amd64 --rm alpine:latest sh -c 'cd /tmp && wget -q https://github.com/stern/stern/releases/download/v1.21.0/stern_1.21.0_linux_amd64.tar.gz && tar -zxf stern_1.21.0_linux_amd64.tar.gz && ./stern --version' 2>&1 | grep 'failed to create new OS thread' > /dev/null 51 | 52 | if [ "$?" = "0" ] 53 | then 54 | exit 1; 55 | fi -------------------------------------------------------------------------------- /run-tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if [ `which podman` ] 4 | then 5 | echo "--Podman-Info-----------------------------------------------------" 6 | podman info 7 | fi 8 | 9 | if [ `which colima` ] 10 | then 11 | echo "--Colima-Version--------------------------------------------------" 12 | colima version 13 | echo "--Colima-Status---------------------------------------------------" 14 | colima status 15 | fi 16 | 17 | if [ `which limactl` ] 18 | then 19 | echo "--Limactl-Version-------------------------------------------------" 20 | limactl --version 21 | echo "--Limactl-Info----------------------------------------------------" 22 | limactl info 23 | fi 24 | 25 | if [ `which docker` ] 26 | then 27 | echo "--Docker----------------------------------------------------------" 28 | docker version 29 | 30 | echo "--binfmt----------------------------------------------------------" 31 | docker run --privileged --rm tonistiigi/binfmt 32 | fi 33 | 34 | if [ `which docker-compose` ] 35 | then 36 | echo "--Docker-Compose--------------------------------------------------" 37 | docker-compose version 38 | fi 39 | 40 | if [ `which lsb_release` ] 41 | then 42 | echo "--Lsb-Release-----------------------------------------------------" 43 | lsb_release -a 44 | fi 45 | 46 | if [ `which sw_vers` ] 47 | then 48 | echo "--Sw-Vers---------------------------------------------------------" 49 | sw_vers 50 | fi 51 | 52 | echo "--uname-------------------------------------------------------------" 53 | uname -a 54 | 55 | echo "--------------------------------------------------------------------" 56 | echo "Run tests: " 57 | 58 | cd tests/ 59 | 60 | ls | grep '.sh' | while read file 61 | do 62 | sh ./$file 63 | if [ "$?" = "0" ] 64 | then 65 | echo " - $file: ✅ OK" 66 | else 67 | echo " - $file: 🛑 FAILED" 68 | fi 69 | done -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # state-of-docker-on-m1 2 | 3 | Since making docker desktop unavailable for free to larger organizations, there are multiple alternatives people might 4 | evaluate. But there is also a difference between Apple M1 and Apple Intel devices. Thus this little repository provides 5 | information of the state of how which setup compares in terms of working. 6 | 7 | ## Results 8 | 9 | Last update: 2022-08-12 (rancher desktopd: 2025-09-02) 10 | 11 | | Test ID | Summary | [rancher-desktop-dockerd on m1](./setups/rancher-desktop-dockerd-m1.md) | [colima](./setups/colima-m1.md) | [podman-m1](./setups/podman-m1.md) | [docker-desktop-m1](./setups/docker-desktop-m1.md) | [minikube-hyperkit-m1](./setups/minikube-hyperkit-m1.md) | [minikube-docker-desktop-m1](./setups/minikube-docker-desktop-m1.md) | [docker-desktop on intel](./setups/docker-desktop-intel.md) | [ubuntu-amd64](./setups/ubuntu-amd64.md) | 12 | |---------------------|------------------------------|-----------------------------------------------------------------------|---------------------------------|-----------------------------------|---------------------------------------------------|----------------------------------------------------------|---------------------------------------------------------------------|-------------------------------------------------------------|------------------------------------------| 13 | | | | v1.19.3 | v0.4.4 | v4.2.0 | v20.10.17 | v1.25.1 | v1.16.1 | v20.10.17 | v20.10.17 | 14 | | [t1](./tests/t1.sh) | trusty openresty amd64 image | 🛑 | 🛑 | ❌ | 🛑 | ❌ | 🛑 | ✅ | ✅ | 15 | | [t2](./tests/t2.sh) | alpine openresty amd64 image | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | ✅ | ✅ | 16 | | [t3](./tests/t3.sh) | old stern amd64 image | ✅ | 🛑 | ✅ | 🛑 | ❌ | ✅ | ✅ | ✅ | 17 | | [t4](./tests/t4.sh) | current stern amd64 image | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | 18 | | [t5](./tests/t5.sh) | varnish 6.0.10 image | ✅ | 🛑 | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | 19 | | [t6](./tests/t6.sh) | applet not found regression | ✅ | | | | ❌ | | | ✅ | 20 | 21 | Changes: 22 | 23 | - rancher desktop from v1.8.1 to v1.19.3 fixed t5 on m1 24 | - rancher desktop from v1.5.1 to v1.6.2 fixed t3 on m1 25 | - rancher desktop from v1.5.0 to v1.5.1, broke t3 and t5, but fixed t6 (see [rancher-desktop#2659](https://github.com/rancher-sandbox/rancher-desktop/issues/2659)) 26 | - rancher desktop from v1.1.1 to v1.5.0 fixed t3 and t5 on m1 but created t6 27 | - podman from v3.4.4 to v4.2.0 t1+t2 openresty freezes now (also bad) and does not error (like before) 28 | 29 | Hints: 30 | 31 | 1. [minikube-hyperkit-m1](./setups/minikube-hyperkit-m1.md) does look so bad, because hyperkit is not supported on arm at all and will never be (see [moby/hyperkit#310](https://github.com/moby/hyperkit/issues/310) for more information). 32 | 33 | ## Setups 34 | 35 | * M1 Mac Setups (on a MacBook Pro (16", 2021), Chip: `Apple M1 Pro`) 36 | * lima vm based: 37 | * ⚠️ [rancher-desktop-dockerd on m1](./setups/rancher-desktop-dockerd-m1.md) 38 | * ⚠️ [colima on m1](./setups/colima-m1.md) 39 | * qemu vm based: 40 | * ⚠️ [podman-m1](./setups/podman-m1.md) 41 | * docker desktop based: 42 | * ⚠️ [docker-desktop on m1](./setups/docker-desktop-m1.md) 43 | * ⚠️ [minikube-docker-desktop on m1](./setups/minikube-docker-desktop-m1.md) 44 | * hyperkit based: 45 | * ❌ [minikube-hyperkit on m1](./setups/minikube-hyperkit-m1.md) (unsupported because of [moby/hyperkit#310](https://github.com/moby/hyperkit/issues/310)) 46 | * Intel Mac Setups (on a MacBook Pro (16", 2019), Chip: `Intel Core i9`) 47 | * ✅ [docker-desktop on intel](./setups/docker-desktop-intel.md) 48 | * Non Mac Setup (for comparison on Ubuntu x86_64): 49 | * ✅ [ubuntu-amd64](./setups/ubuntu-amd64.md) 50 | 51 | ## License 52 | 53 | This work is copyright by DracoBlue (http://dracoblue.net) and licensed under the terms of MIT License. 54 | --------------------------------------------------------------------------------