docker.sh 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. #!/usr/bin/env sh
  2. #DEPLOY_DOCKER_CONTAINER_LABEL="xxxxxxx"
  3. #DOCKER_HOST=/var/run/docker.sock | tcp://localhost:8888
  4. #DEPLOY_DOCKER_CONTAINER_KEY_FILE="/path/to/key.pem"
  5. #DEPLOY_DOCKER_CONTAINER_CERT_FILE="/path/to/cert.pem"
  6. #DEPLOY_DOCKER_CONTAINER_CA_FILE="/path/to/ca.pem"
  7. #DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE="/path/to/fullchain.pem"
  8. #DEPLOY_DOCKER_CONTAINER_RELOAD_CMD="service nginx force-reload"
  9. _DEPLOY_DOCKER_WIKI="http://xxxxxx"
  10. _DOCKER_HOST_DEFAULT="/var/run/docker.sock"
  11. docker_deploy() {
  12. _cdomain="$1"
  13. _ckey="$2"
  14. _ccert="$3"
  15. _cca="$4"
  16. _cfullchain="$5"
  17. if [ -z "$DEPLOY_DOCKER_CONTAINER_LABEL" ]; then
  18. _err "The DEPLOY_DOCKER_CONTAINER_LABEL variable is not defined, we use this label to find the container."
  19. _err "See: $_DEPLOY_DOCKER_WIKI"
  20. fi
  21. _savedomainconf DEPLOY_DOCKER_CONTAINER_LABEL "$DEPLOY_DOCKER_CONTAINER_LABEL"
  22. if [ "$DOCKER_HOST" ]; then
  23. _saveaccountconf DOCKER_HOST "$DOCKER_HOST"
  24. fi
  25. if _exists docker && docker version | grep -i docker >/dev/null; then
  26. _info "Using docker command"
  27. export _USE_DOCKER_COMMAND=1
  28. else
  29. export _USE_DOCKER_COMMAND=
  30. fi
  31. export _USE_UNIX_SOCKET=
  32. if [ -z "$_USE_DOCKER_COMMAND" ]; then
  33. export _USE_REST=
  34. if [ "$DOCKER_HOST" ]; then
  35. _debug "Try use docker host: $DOCKER_HOST"
  36. export _USE_REST=1
  37. else
  38. export _DOCKER_SOCK="$_DOCKER_HOST_DEFAULT"
  39. _debug "Try use $_DOCKER_SOCK"
  40. if [ ! -e "$_DOCKER_SOCK" ] || [ ! -w "$_DOCKER_SOCK" ]; then
  41. _err "$_DOCKER_SOCK is not available"
  42. return 1
  43. fi
  44. export _USE_UNIX_SOCKET=1
  45. if ! _exists "curl"; then
  46. _err "Please install curl first."
  47. _err "We need curl to work."
  48. return 1
  49. fi
  50. if ! _check_curl_version; then
  51. return 1
  52. fi
  53. fi
  54. fi
  55. if [ "$DEPLOY_DOCKER_CONTAINER_KEY_FILE" ]; then
  56. _savedomainconf DEPLOY_DOCKER_CONTAINER_KEY_FILE "$DEPLOY_DOCKER_CONTAINER_KEY_FILE"
  57. fi
  58. if [ "$DEPLOY_DOCKER_CONTAINER_CERT_FILE" ]; then
  59. _savedomainconf DEPLOY_DOCKER_CONTAINER_CERT_FILE "$DEPLOY_DOCKER_CONTAINER_CERT_FILE"
  60. fi
  61. if [ "$DEPLOY_DOCKER_CONTAINER_CA_FILE" ]; then
  62. _savedomainconf DEPLOY_DOCKER_CONTAINER_CA_FILE "$DEPLOY_DOCKER_CONTAINER_CA_FILE"
  63. fi
  64. if [ "$DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE" ]; then
  65. _savedomainconf DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE "$DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE"
  66. fi
  67. if [ "$DEPLOY_DOCKER_CONTAINER_RELOAD_CMD" ]; then
  68. _savedomainconf DEPLOY_DOCKER_CONTAINER_RELOAD_CMD "$DEPLOY_DOCKER_CONTAINER_RELOAD_CMD"
  69. fi
  70. _cid="$(_get_id "$DEPLOY_DOCKER_CONTAINER_LABEL")"
  71. _info "Container id: $_cid"
  72. if [ -z "$_cid" ]; then
  73. _err "can not find container id"
  74. return 1
  75. fi
  76. if [ "$DEPLOY_DOCKER_CONTAINER_KEY_FILE" ]; then
  77. if ! _docker_cp "$_cid" "$_ckey" "$DEPLOY_DOCKER_CONTAINER_KEY_FILE"; then
  78. return 1
  79. fi
  80. fi
  81. if [ "$DEPLOY_DOCKER_CONTAINER_CERT_FILE" ]; then
  82. if ! _docker_cp "$_cid" "$_ccert" "$DEPLOY_DOCKER_CONTAINER_CERT_FILE"; then
  83. return 1
  84. fi
  85. fi
  86. if [ "$DEPLOY_DOCKER_CONTAINER_CA_FILE" ]; then
  87. if ! _docker_cp "$_cid" "$_cca" "$DEPLOY_DOCKER_CONTAINER_CA_FILE"; then
  88. return 1
  89. fi
  90. fi
  91. if [ "$DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE" ]; then
  92. if ! _docker_cp "$_cid" "$_cfullchain" "$DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE"; then
  93. return 1
  94. fi
  95. fi
  96. if [ "$DEPLOY_DOCKER_CONTAINER_RELOAD_CMD" ]; then
  97. if ! _docker_exec "$_cid" "$DEPLOY_DOCKER_CONTAINER_RELOAD_CMD"; then
  98. return 1
  99. fi
  100. fi
  101. return 0
  102. }
  103. #label
  104. _get_id() {
  105. _label="$1"
  106. if [ "$_USE_DOCKER_COMMAND" ]; then
  107. docker ps -f label="$_label" --format "{{.ID}}"
  108. elif [ "$_USE_REST" ]; then
  109. _err "Not implemented yet."
  110. return 1
  111. elif [ "$_USE_UNIX_SOCKET" ]; then
  112. _req="{\"label\":[\"$_label\"]}"
  113. _debug2 _req "$_req"
  114. _req="$(printf "%s" "$_req" | _url_encode)"
  115. _debug2 _req "$_req"
  116. listjson="$(_curl_unix_sock "${_DOCKER_SOCK:-$_DOCKER_HOST_DEFAULT}" GET "/containers/json?filters=$_req")"
  117. _debug2 "listjson" "$listjson"
  118. echo "$listjson" | tr '{,' '\n' | grep -i '"id":' | _head_n 1 | cut -d '"' -f 4
  119. else
  120. _err "Not implemented yet."
  121. return 1
  122. fi
  123. }
  124. #id cmd
  125. _docker_exec() {
  126. _eargs="$@"
  127. _debug2 "_docker_exec $_eargs"
  128. _dcid="$1"
  129. shift
  130. if [ "$_USE_DOCKER_COMMAND" ]; then
  131. docker exec -i "$_dcid" $@
  132. elif [ "$_USE_REST" ]; then
  133. _err "Not implemented yet."
  134. return 1
  135. elif [ "$_USE_UNIX_SOCKET" ]; then
  136. _cmd="$@"
  137. _cmd="$(printf "$_cmd" | sed 's/ /","/g')"
  138. _debug2 _cmd "$_cmd"
  139. #create exec instance:
  140. cjson="$(_curl_unix_sock "$_DOCKER_SOCK" POST "/containers/$_dcid/exec" "{\"Cmd\": [\"$_cmd\"]}")";
  141. _debug2 cjson "$cjson"
  142. execid="$(echo "$cjson" | cut -d '"' -f 4)"
  143. _debug execid "$execid"
  144. ejson="$(_curl_unix_sock "$_DOCKER_SOCK" POST "/exec/$execid/start" "{\"Detach\": false,\"Tty\": false}")";
  145. _debug2 ejson "$ejson"
  146. else
  147. _err "Not implemented yet."
  148. return 1
  149. fi
  150. }
  151. #id from to
  152. _docker_cp() {
  153. _dcid="$1"
  154. _from="$2"
  155. _to="$3"
  156. _info "Copying file from $_from to $_to"
  157. _dir="$(dirname "$_to")"
  158. _docker_exec "$_dcid" mkdir -p "$_dir"
  159. if [ "$_USE_DOCKER_COMMAND" ]; then
  160. cat "$_from" | _docker_exec "$_dcid" tee "$_to" >/dev/null
  161. if [ "$?" = "0" ]; then
  162. _info "Success"
  163. return 0
  164. else
  165. _info "Error"
  166. return 1
  167. fi
  168. elif [ "$_USE_REST" ]; then
  169. _err "Not implemented yet."
  170. return 1
  171. elif [ "$_USE_UNIX_SOCKET" ]; then
  172. _frompath="$_from"
  173. if _startswith "$_frompath" '/'; then
  174. _frompath="$(echo "$_from" | cut -b 2- )" #remove the first '/' char
  175. fi
  176. _debug2 "_frompath" "$_frompath"
  177. _toname="$(basename "$_to")"
  178. _debug2 "_toname" "$_toname"
  179. if ! tar --transform="s,$_frompath,$_toname," -cz "$_from" 2>/dev/null | _curl_unix_sock "$_DOCKER_SOCK" PUT "/containers/$_dcid/archive?noOverwriteDirNonDir=1&path=$(printf "%s" "$_dir" | _url_encode)" '@-' "Content-Type: application/octet-stream"; then
  180. _err "copy error"
  181. return 1
  182. fi
  183. return 0
  184. else
  185. _err "Not implemented yet."
  186. return 1
  187. fi
  188. }
  189. #sock method endpoint data content-type
  190. _curl_unix_sock() {
  191. _socket="$1"
  192. _method="$2"
  193. _endpoint="$3"
  194. _data="$4"
  195. _ctype="$5"
  196. if [ -z "$_ctype" ]; then
  197. _ctype="Content-Type: application/json"
  198. fi
  199. _debug _data "$_data"
  200. _debug2 "url" "http://localhost$_endpoint"
  201. if [ "$_CURL_NO_HOST" ]; then
  202. _cux_url="http:$_endpoint"
  203. else
  204. _cux_url="http://localhost$_endpoint"
  205. fi
  206. if [ "$DEBUG" ] && [ "$DEBUG" -ge "2" ]; then
  207. curl -vvv --silent --unix-socket "$_socket" -X $_method --data-binary "$_data" --header "$_ctype" "$_cux_url"
  208. else
  209. curl --silent --unix-socket "$_socket" -X $_method --data-binary "$_data" --header "$_ctype" "$_cux_url"
  210. fi
  211. }
  212. _check_curl_version() {
  213. _cversion="$(curl -V | grep '^curl ' | cut -d ' ' -f 2)"
  214. _debug2 "_cversion" "$_cversion"
  215. _major="$(_getfield "$_cversion" 1 '.')"
  216. _debug2 "_major" "$_major"
  217. _minor="$(_getfield "$_cversion" 2 '.')"
  218. _debug2 "_minor" "$_minor"
  219. if [ "$_major$_minor" -lt "740" ]; then
  220. _err "curl v$_cversion doesn't support unit socket"
  221. return 1
  222. fi
  223. if [ "$_major$_minor" -lt "750" ]; then
  224. _debug "Use short host name"
  225. export _CURL_NO_HOST=1
  226. else
  227. export _CURL_NO_HOST=
  228. fi
  229. return 0
  230. }