Skip to content

Instantly share code, notes, and snippets.

@visualphoenix
Created September 1, 2021 15:04
Show Gist options
  • Save visualphoenix/1bfa6f05289902bf2858bc5357e7d971 to your computer and use it in GitHub Desktop.
Save visualphoenix/1bfa6f05289902bf2858bc5357e7d971 to your computer and use it in GitHub Desktop.
docker-machine setup for mac with nfs and vmware
#!/bin/bash
#
# the following functions can be used to provision, or reprovision docker-machine as a replacement for docker-for-mac
# it has only been tested with vmware on osx catalina
#
# it assumes the following has already been run:
# brew install docker-machine docker
#
get-interface-ip-from-ip-route() {
local ip="${1}"
ifconfig -m "$(route get "${ip}" | awk '{if ($1 ~ /interface:/){print $2}}')" | awk 'sub(/inet /,""){print $1}'
}
idempotent-append() {
local LINE="" FILE="" SUDO=""
LINE="$1"
FILE="$2"
SUDO=$([[ -w "$FILE" ]] && echo "" || echo "sudo")
grep -qF -- "$LINE" "$FILE" 2>/dev/null || echo "$LINE" | $SUDO tee -a "$FILE"
}
nfs-setup() {
local interface_ip="" machine_ip=""
idempotent-append "$HOME -alldirs -mapall=$(id -u):$(id -g) localhost" /etc/exports
if [[ "$(docker-machine status)" == "Running" ]]; then
interface_ip=$(get-interface-ip-from-ip-route "$(docker-machine ip "$(docker-machine active)")")
idempotent-append "$HOME -alldirs -mapall=$(id -u):$(id -g) $interface_ip" /etc/exports
machine_ip=$(docker-machine ip "$(docker-machine active)")
idempotent-append "$HOME -alldirs -mapall=$(id -u):$(id -g) $machine_ip" /etc/exports
fi
idempotent-append "nfs.server.mount.require_resv_port = 0" /etc/nfs.conf
sudo nfsd restart
}
docker-machine-reset() {
local driver="vmware"
driver="${1:-$driver}"
docker-machine ls -q | xargs docker-machine rm -y
eval docker-machine create --driver="${driver}" --"${driver}"-boot2docker-url https://github.com/kaosagnt/boot2docker-xfs-ng/releases/download/20.10.8/boot2docker.iso default
eval "$(docker-machine env default)"
host_docker_internal=$(get-interface-ip-from-ip-route "$(docker-machine ip default)")
docker-machine ssh default "l=\"$host_docker_internal host.docker.internal\"; grep -qF \"\$l\" /etc/hosts 2>/dev/null || echo \"\$l\" | sudo tee -a /etc/hosts 2>/dev/null; [[ -e /var/run/rpcbind.sock ]] || sudo /usr/local/etc/init.d/nfs-client start"
while read -r exported_folder
do
docker-machine ssh default "sudo mkdir -p $exported_folder; sudo mount -t nfs -o rw,relatime,vers=3,rsize=65536,wsize=65536,namlen=255,hard,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,mountvers=3,mountproto=tcp,local_lock=posix host.docker.internal:$exported_folder $exported_folder"
done < <(cat /etc/exports | awk '{print $1}' | sort -u)
docker-machine ssh default "echo '{\"max-concurrent-uploads\":10,\"max-concurrent-downloads\":10}' | sudo tee /etc/docker/daemon.json"
docker-machine ssh default "sudo sed -i'' -e 's/ulimit -p unlimited/ulimit -u unlimited/' /etc/init.d/docker; sudo /etc/init.d/docker restart"
}
mount-home-volume() {
docker volume create -d local -o type="nfs" -o o="addr=host.docker.internal,rw,local_lock=posix,hard,nointr,nfsvers=3,rsize=1048576,wsize=1048576,timeo=600,retrans=2,noresvport" -o device=":$HOME" --name home_nfs &> /dev/null
echo "-v \"home_nfs:$HOME\" -e \"HOST_HOME=$HOME\" -w \"$PWD\""
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment