├── .gitignore ├── README.md ├── build ├── destroy ├── kill ├── list ├── resume ├── run └── vpm /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #VPM - Viz Parallel Magic 2 | 3 | A X11 Dockerization Magic 4 | 5 | ## Usage 6 | 7 | ### build 8 | 9 | Build a parallel magic image 10 | 11 | Example (build a ubuntu:14.04 image): 12 | ``` 13 | $ vpm build ubuntu:14.04 14 | ``` 15 | 16 | ### run 17 | 18 | Run a pre-build container 19 | Example (run a ubuntu:14.04 container): 20 | ``` 21 | $ vpm run ubuntu:14.04 22 | ``` 23 | 24 | Example (run a ubuntu:14.04 container with name test): 25 | ``` 26 | $ vpm run ubuntu:14.04 test 27 | ``` 28 | 29 | ### list 30 | 31 | List VPM images/containers 32 | 33 | Example (list images): 34 | ``` 35 | $ vpm list i 36 | ``` 37 | 38 | Example (list containers): 39 | ``` 40 | $ vpm list c 41 | ``` 42 | 43 | ### kill 44 | 45 | Kill a container 46 | 47 | Example (kill container with ID ac82066dffa6): 48 | ``` 49 | $ vpm kill ac82066dffa6 50 | ``` 51 | 52 | Example (kill container with name test): 53 | ``` 54 | $ vpm kill test 55 | ``` 56 | 57 | ### resume 58 | 59 | Resume a container and attach to it 60 | 61 | Example (resume container with ID ac82066dffa6): 62 | ``` 63 | $ vpm resume ac82066dffa6 64 | ``` 65 | 66 | Example (resume container with name test): 67 | ``` 68 | $ vpm resume test 69 | ``` 70 | 71 | ### destroy 72 | 73 | Permanently destroy a container 74 | 75 | Example (destroy container with ID ac82066dffa6): 76 | ``` 77 | $ vpm destroy ac82066dffa6 78 | ``` 79 | 80 | Example (destroy container with name test): 81 | ``` 82 | $ vpm destroy test 83 | ``` 84 | 85 | --- 86 | 87 | #VPM - Viz Parallel Magic 88 | 89 | 一个在 Docker 中跑 X11 应用的黑魔法 90 | 91 | ## 用法 92 | 93 | ### build 94 | 95 | 构建一个 VPM 的 Docker 镜像 96 | 97 | 例子 (构建一个 ubuntu:14.04 镜像): 98 | ``` 99 | $ vpm build ubuntu:14.04 100 | ``` 101 | 102 | ### run 103 | 104 | 启动一个新的 VPM 容器 105 | 例子 (启动一个 ubuntu:14.04 容器): 106 | ``` 107 | $ vpm run ubuntu:14.04 108 | ``` 109 | 110 | 例子 (启动一个 ubuntu:14.04 容器,并取名 test): 111 | ``` 112 | $ vpm run ubuntu:14.04 test 113 | ``` 114 | 115 | ### list 116 | 117 | 列出 VPM 的镜像/容器 118 | 119 | 例子 (列出镜像): 120 | ``` 121 | $ vpm list i 122 | ``` 123 | 124 | 例子 (列出容器): 125 | ``` 126 | $ vpm list c 127 | ``` 128 | 129 | ### kill 130 | 131 | 强行终止一个容器 132 | 133 | 例子 (终止一个 ID 为 ac82066dffa6 的容器): 134 | ``` 135 | $ vpm kill ac82066dffa6 136 | ``` 137 | 138 | 例子 (终止一个名字为 test 的容器): 139 | ``` 140 | $ vpm kill test 141 | ``` 142 | 143 | ### resume 144 | 145 | 恢复一个容器 146 | 147 | 例子 (恢复一个 ID 为 ac82066dffa6 的容器): 148 | ``` 149 | $ vpm resume ac82066dffa6 150 | ``` 151 | 152 | 例子 (恢复一个名字为 test 的容器): 153 | ``` 154 | $ vpm resume test 155 | ``` 156 | 157 | ### destroy 158 | 159 | 永久销毁一个容器 160 | 161 | 例子 (销毁一个 ID 为 ac82066dffa6 的容器): 162 | ``` 163 | $ vpm destroy ac82066dffa6 164 | ``` 165 | 166 | 例子 (销毁一个名字为 test 的容器): 167 | ``` 168 | $ vpm destroy test 169 | ``` 170 | -------------------------------------------------------------------------------- /build: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | [ $# -lt 1 ] && { echo "Usage: $0 BASE_IMAGE"; exit 1; } 5 | 6 | fetch_profile () { 7 | grep "^\([^:]*:\)\{2\}$1" "$2" 8 | } 9 | 10 | parse_profile () { 11 | echo "$1" | awk -F':' "{ print \$$2; }" 12 | } 13 | 14 | BASE_IMAGE="$1" 15 | USER_PROFILE="$(fetch_profile "${UID}" /etc/passwd)" 16 | USER="$(parse_profile "${USER_PROFILE}" 1)" 17 | GID="$(parse_profile "${USER_PROFILE}" 4)" 18 | HOME="$(parse_profile "${USER_PROFILE}" 6)" 19 | GROUP_PROFILE="$(fetch_profile "${GID}" /etc/group)" 20 | GROUP="$(parse_profile "${USER_PROFILE}" 1)" 21 | 22 | TMPFILE=/tmp/Dockerfile.$(date +%s) 23 | 24 | cat < ${TMPFILE} 25 | FROM ${BASE_IMAGE} 26 | 27 | RUN echo "root:changeme" | chpasswd 28 | RUN mkdir -p ${HOME} && \\ 29 | echo "${USER}:x:${UID}:${GID}::${HOME}:/bin/bash" >> /etc/passwd && \\ 30 | echo "${GROUP}:x:${GID}:" >> /etc/group && \\ 31 | mkdir -p /etc/sudoers.d && \\ 32 | echo "${USER} ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/${USER} && \\ 33 | chmod 0440 /etc/sudoers.d/${USER} && \\ 34 | chown ${UID}:${GID} -R ${HOME} 35 | 36 | USER ${USER} 37 | ENV HOME ${HOME} 38 | CMD /bin/bash 39 | EOF 40 | 41 | echo "Genereated Dockerfile:" 42 | echo "======================" 43 | cat ${TMPFILE} 44 | echo "======================" 45 | 46 | read -p "Build image now? (y/N) " answer 47 | while true; do 48 | case "$answer" in 49 | [yY]) 50 | echo "Now building the image..." 51 | docker build -t "$BASE_IMAGE-parallel" - < ${TMPFILE} 52 | break;; 53 | [nN]) 54 | break;; 55 | *) 56 | read -p "$answer is an invalid input, put either 'y' or 'n': " answer 57 | esac 58 | done 59 | 60 | rm ${TMPFILE} 61 | -------------------------------------------------------------------------------- /destroy: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | docker rm -f $@ 5 | -------------------------------------------------------------------------------- /kill: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | docker kill $@ 5 | -------------------------------------------------------------------------------- /list: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | F_C=1 5 | F_I=1 6 | case "$1" in 7 | a|all|"") 8 | ;; 9 | i|images) 10 | F_C= 11 | ;; 12 | c|containers) 13 | F_I= 14 | ;; 15 | *) 16 | echo "$1 is not a valid type!" 17 | echo "Usage: $0 [a|all|c|containers|i|images]" 18 | exit 1 19 | esac 20 | 21 | if [ $F_I ]; then 22 | echo "Images" 23 | echo "======" 24 | docker images | grep '^[^ ]* *[^ ]*-parallel' \ 25 | | awk -F' {2,}' '{ printf "%s:%s\n", $1, $2; }' 26 | echo 27 | fi 28 | 29 | if [ $F_C ]; then 30 | echo "Containers" 31 | echo "==========" 32 | printf "%s %-30s %-20s %s\n" "CONTAINER ID" "IMAGE" "NAME" "STATUS" 33 | docker ps -a | grep '^[^ ]* *[^ ]*-parallel' \ 34 | | awk -F' {2,}' '{ printf "%s %-30s %-20s %s\n", $1, $2, $6, $5; }' 35 | fi 36 | -------------------------------------------------------------------------------- /resume: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | docker start $@ 5 | 6 | echo "> Resume container. (press Ctrl+P then Ctrl+Q to detach)" 7 | docker attach --sig-proxy=true $@ 8 | -------------------------------------------------------------------------------- /run: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | NAME= 5 | [ $# -lt 1 ] && { echo "Usage: $0 BASE_IMAGE [CONTAINER_NAME]"; exit 1; } 6 | [ $2 ] && NAME=$2 7 | 8 | if $(docker images | awk '{ print $1":"$2; }' | grep -q "$1-parallel"); then 9 | echo "> Image found!" 10 | else 11 | echo "> Image not found!" 12 | read -p "Do you want to build it? (y/N) " answer 13 | while true; do 14 | case "$answer" in 15 | [yY]) 16 | if $(./build "$1"); then 17 | echo "> Image has been built." 18 | else 19 | echo "> Image failed to built." 20 | exit 1 21 | fi 22 | break;; 23 | [nN]) 24 | echo "> Image will not be built." 25 | exit 0 26 | break;; 27 | *) 28 | read -p "$answer is an invalid input, put either 'y' or 'n': " answer 29 | esac 30 | done 31 | fi 32 | 33 | echo "> start container! (press Ctrl+P then Ctrl+Q to detach)" 34 | docker run -ti -e DISPLAY=$DISPLAY \ 35 | -v /tmp/.X11-unix:/tmp/.X11-unix \ 36 | -v $HOME:$HOME \ 37 | --name="$NAME" \ 38 | --net=host \ 39 | -v /dev/snd:/dev/snd --privileged \ 40 | -v /dev/shm:/dev/shm \ 41 | -v /etc/machine-id:/etc/machine-id \ 42 | -v /var/lib/dbus:/var/lib/dbus \ 43 | -v /run/user/$UID/pulse/native:/run/user/$UID/pulse/native \ 44 | "$1-parallel" 45 | -------------------------------------------------------------------------------- /vpm: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | cd $(dirname $(realpath "$0")) 5 | 6 | if [ $# -lt 1 ]; then 7 | echo "Usage: $0 COMMAND [arg...]" 8 | echo 9 | echo "Viz Parallel Magic - A X11 Dockerization Magic!" 10 | echo 11 | echo "Commands:" 12 | echo " build Build a parallel magic image" 13 | echo " run Run a pre-build container" 14 | echo " list List VPM images/containers" 15 | echo " kill Kill a container" 16 | echo " resume Resume a container and attach to it" 17 | echo " destroy Permanently destroy a container" 18 | 19 | exit 1 20 | fi 21 | 22 | "./$@" 23 | --------------------------------------------------------------------------------