3 #DEPLOY_DOCKER_CONTAINER_LABEL="xxxxxxx"
5 #DEPLOY_DOCKER_CONTAINER_KEY_FILE="/path/to/key.pem"
6 #DEPLOY_DOCKER_CONTAINER_CERT_FILE="/path/to/cert.pem"
7 #DEPLOY_DOCKER_CONTAINER_CA_FILE="/path/to/ca.pem"
8 #DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE="/path/to/fullchain.pem"
9 #DEPLOY_DOCKER_CONTAINER_RELOAD_CMD="service nginx force-reload"
11 _DEPLOY_DOCKER_WIKI
="https://github.com/acmesh-official/acme.sh/wiki/deploy-to-docker-containers"
13 _DOCKER_HOST_DEFAULT
="/var/run/docker.sock"
21 _debug _cdomain
"$_cdomain"
22 _getdeployconf DEPLOY_DOCKER_CONTAINER_LABEL
23 _debug2 DEPLOY_DOCKER_CONTAINER_LABEL
"$DEPLOY_DOCKER_CONTAINER_LABEL"
24 if [ -z "$DEPLOY_DOCKER_CONTAINER_LABEL" ]; then
25 _err
"The DEPLOY_DOCKER_CONTAINER_LABEL variable is not defined, we use this label to find the container."
26 _err
"See: $_DEPLOY_DOCKER_WIKI"
29 _savedeployconf DEPLOY_DOCKER_CONTAINER_LABEL
"$DEPLOY_DOCKER_CONTAINER_LABEL"
31 if [ "$DOCKER_HOST" ]; then
32 _saveaccountconf DOCKER_HOST
"$DOCKER_HOST"
35 if _exists docker
&& docker version |
grep -i docker
>/dev
/null
; then
36 _info
"Using docker command"
37 export _USE_DOCKER_COMMAND
=1
39 export _USE_DOCKER_COMMAND
=
42 export _USE_UNIX_SOCKET
=
43 if [ -z "$_USE_DOCKER_COMMAND" ]; then
45 if [ "$DOCKER_HOST" ]; then
46 _debug
"Try use docker host: $DOCKER_HOST"
49 export _DOCKER_SOCK
="$_DOCKER_HOST_DEFAULT"
50 _debug
"Try use $_DOCKER_SOCK"
51 if [ ! -e "$_DOCKER_SOCK" ] ||
[ ! -w "$_DOCKER_SOCK" ]; then
52 _err
"$_DOCKER_SOCK is not available"
55 export _USE_UNIX_SOCKET
=1
56 if ! _exists
"curl"; then
57 _err
"Please install curl first."
58 _err
"We need curl to work."
61 if ! _check_curl_version
; then
67 _getdeployconf DEPLOY_DOCKER_CONTAINER_KEY_FILE
68 _debug2 DEPLOY_DOCKER_CONTAINER_KEY_FILE
"$DEPLOY_DOCKER_CONTAINER_KEY_FILE"
69 if [ "$DEPLOY_DOCKER_CONTAINER_KEY_FILE" ]; then
70 _savedeployconf DEPLOY_DOCKER_CONTAINER_KEY_FILE
"$DEPLOY_DOCKER_CONTAINER_KEY_FILE"
73 _getdeployconf DEPLOY_DOCKER_CONTAINER_CERT_FILE
74 _debug2 DEPLOY_DOCKER_CONTAINER_CERT_FILE
"$DEPLOY_DOCKER_CONTAINER_CERT_FILE"
75 if [ "$DEPLOY_DOCKER_CONTAINER_CERT_FILE" ]; then
76 _savedeployconf DEPLOY_DOCKER_CONTAINER_CERT_FILE
"$DEPLOY_DOCKER_CONTAINER_CERT_FILE"
79 _getdeployconf DEPLOY_DOCKER_CONTAINER_CA_FILE
80 _debug2 DEPLOY_DOCKER_CONTAINER_CA_FILE
"$DEPLOY_DOCKER_CONTAINER_CA_FILE"
81 if [ "$DEPLOY_DOCKER_CONTAINER_CA_FILE" ]; then
82 _savedeployconf DEPLOY_DOCKER_CONTAINER_CA_FILE
"$DEPLOY_DOCKER_CONTAINER_CA_FILE"
85 _getdeployconf DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE
86 _debug2 DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE
"$DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE"
87 if [ "$DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE" ]; then
88 _savedeployconf DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE
"$DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE"
91 _getdeployconf DEPLOY_DOCKER_CONTAINER_RELOAD_CMD
92 _debug2 DEPLOY_DOCKER_CONTAINER_RELOAD_CMD
"$DEPLOY_DOCKER_CONTAINER_RELOAD_CMD"
93 if [ "$DEPLOY_DOCKER_CONTAINER_RELOAD_CMD" ]; then
94 _savedeployconf DEPLOY_DOCKER_CONTAINER_RELOAD_CMD
"$DEPLOY_DOCKER_CONTAINER_RELOAD_CMD" "base64"
97 _cid
="$(_get_id "$DEPLOY_DOCKER_CONTAINER_LABEL")"
98 _info
"Container id: $_cid"
99 if [ -z "$_cid" ]; then
100 _err
"can not find container id"
104 if [ "$DEPLOY_DOCKER_CONTAINER_KEY_FILE" ]; then
105 if ! _docker_cp
"$_cid" "$_ckey" "$DEPLOY_DOCKER_CONTAINER_KEY_FILE"; then
110 if [ "$DEPLOY_DOCKER_CONTAINER_CERT_FILE" ]; then
111 if ! _docker_cp
"$_cid" "$_ccert" "$DEPLOY_DOCKER_CONTAINER_CERT_FILE"; then
116 if [ "$DEPLOY_DOCKER_CONTAINER_CA_FILE" ]; then
117 if ! _docker_cp
"$_cid" "$_cca" "$DEPLOY_DOCKER_CONTAINER_CA_FILE"; then
122 if [ "$DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE" ]; then
123 if ! _docker_cp
"$_cid" "$_cfullchain" "$DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE"; then
128 if [ "$DEPLOY_DOCKER_CONTAINER_RELOAD_CMD" ]; then
129 _info
"Reloading: $DEPLOY_DOCKER_CONTAINER_RELOAD_CMD"
130 if ! _docker_exec
"$_cid" "$DEPLOY_DOCKER_CONTAINER_RELOAD_CMD"; then
140 if [ "$_USE_DOCKER_COMMAND" ]; then
141 docker ps
-f label
="$_label" --format "{{.ID}}"
142 elif [ "$_USE_REST" ]; then
143 _err
"Not implemented yet."
145 elif [ "$_USE_UNIX_SOCKET" ]; then
146 _req
="{\"label\":[\"$_label\"]}"
148 _req
="$(printf "%s
" "$_req" | _url_encode)"
150 listjson
="$(_curl_unix_sock "${_DOCKER_SOCK:-$_DOCKER_HOST_DEFAULT}" GET "/containers
/json?filters
=$_req")"
151 _debug2
"listjson" "$listjson"
152 echo "$listjson" |
tr '{,' '\n' |
grep -i '"id":' | _head_n
1 | cut
-d '"' -f 4
154 _err
"Not implemented yet."
162 _debug2
"_docker_exec $_eargs"
165 if [ "$_USE_DOCKER_COMMAND" ]; then
166 docker
exec -i "$_dcid" sh
-c "$*"
167 elif [ "$_USE_REST" ]; then
168 _err
"Not implemented yet."
170 elif [ "$_USE_UNIX_SOCKET" ]; then
172 #_cmd="$(printf "%s" "$_cmd" | sed 's/ /","/g')"
174 #create exec instance:
175 cjson
="$(_curl_unix_sock "$_DOCKER_SOCK" POST "/containers
/$_dcid/exec" "{\"Cmd
\": [\"sh
\", \"-c\", \"$_cmd\"]}")"
176 _debug2 cjson
"$cjson"
177 execid
="$(echo "$cjson" | cut -d '"' -f 4)"
178 _debug execid "$execid"
179 ejson="$(_curl_unix_sock "$_DOCKER_SOCK" POST "/exec/$execid/start" "{\"Detach\": false,\"Tty\": false}")"
180 _debug2 ejson "$ejson"
181 if [ "$ejson" ]; then
186 _err "Not implemented yet."
196 _info "Copying file from $_from to $_to"
197 _dir="$(dirname "$_to")"
199 if ! _docker_exec "$_dcid" mkdir -p "$_dir"; then
200 _err "Can not create dir: $_dir"
203 if [ "$_USE_DOCKER_COMMAND" ]; then
204 if [ "$DEBUG" ] && [ "$DEBUG" -ge "2" ]; then
205 _docker_exec "$_dcid" tee "$_to" <"$_from"
207 _docker_exec "$_dcid" tee "$_to" <"$_from" >/dev/null
209 if [ "$?" = "0" ]; then
216 elif [ "$_USE_REST" ]; then
217 _err "Not implemented yet."
219 elif [ "$_USE_UNIX_SOCKET" ]; then
221 if _startswith "$_frompath" '/'; then
222 _frompath="$(echo "$_from" | cut -b 2-)" #remove the first '/' char
224 _debug2 "_frompath" "$_frompath"
225 _toname="$(basename "$_to")"
226 _debug2 "_toname" "$_toname"
227 _debug2 "_from" "$_from"
228 if ! tar --transform="s,$(printf "%s" "$_frompath" | tr '*' .),$_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
234 _err "Not implemented yet."
240 #sock method endpoint data content-type
247 if [ -z "$_ctype" ]; then
248 _ctype="Content-Type: application/json"
250 _debug _data "$_data"
251 _debug2 "url" "http://localhost$_endpoint"
252 if [ "$_CURL_NO_HOST" ]; then
253 _cux_url="http:$_endpoint"
255 _cux_url="http://localhost$_endpoint"
258 if [ "$DEBUG" ] && [ "$DEBUG" -ge "2" ]; then
259 curl -vvv --silent --unix-socket "$_socket" -X "$_method" --data-binary "$_data" --header "$_ctype" "$_cux_url"
261 curl --silent --unix-socket "$_socket" -X "$_method" --data-binary "$_data" --header "$_ctype" "$_cux_url"
266 _check_curl_version() {
267 _cversion="$(curl -V | grep '^curl
' | cut -d ' ' -f 2)"
268 _debug2 "_cversion" "$_cversion"
270 _major="$(_getfield "$_cversion" 1 '.
')"
271 _debug2 "_major" "$_major"
273 _minor="$(_getfield "$_cversion" 2 '.
')"
274 _debug2 "_minor" "$_minor"
276 if [ "$_major" -ge "8" ]; then
280 if [ "$_major" = "7" ]; then
281 if [ "$_minor" -lt "40" ]; then
282 _err "curl v$_cversion doesn't support unit socket
"
283 _err "Please upgrade to curl
7.40 or later.
"
286 if [ "$_minor" -lt "50" ]; then
287 _debug "Use short
host name
"
288 export _CURL_NO_HOST=1
290 export _CURL_NO_HOST=
294 _err "curl v
$_cversion doesn
't support unit socket"
295 _err "Please upgrade to curl 7.40 or later."