@dazhicheng/common 1.0.46 → 1.0.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deploy-docker.sh +72 -14
- package/package.json +1 -1
package/deploy-docker.sh
CHANGED
|
@@ -140,31 +140,89 @@ wait_http() {
|
|
|
140
140
|
return 1
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
-
#
|
|
143
|
+
# 收集宿主机已占用 TCP 端口(Docker 映射 + 系统监听)
|
|
144
|
+
collect_used_ports() {
|
|
145
|
+
_out=""
|
|
146
|
+
for _id in $(docker ps -q 2>/dev/null); do
|
|
147
|
+
_chunk=$(docker inspect -f \
|
|
148
|
+
'{{range $p, $conf := .NetworkSettings.Ports}}{{if $conf}}{{range $conf}}{{.HostPort}}{{"\n"}}{{end}}{{end}}{{end}}' \
|
|
149
|
+
"$_id" 2>/dev/null || true)
|
|
150
|
+
_out="${_out}${_chunk}"
|
|
151
|
+
done
|
|
152
|
+
if command -v ss >/dev/null 2>&1; then
|
|
153
|
+
_out="${_out}$(ss -H -ltn 2>/dev/null | awk '{print $4}' | sed -e 's/^\[::\]://' -e 's/^.*://')
|
|
154
|
+
"
|
|
155
|
+
elif command -v netstat >/dev/null 2>&1; then
|
|
156
|
+
_out="${_out}$(netstat -ltn 2>/dev/null | awk 'NR>2 {sub(/^.*:/, "", $4); print $4}')"
|
|
157
|
+
fi
|
|
158
|
+
echo "$_out" | grep -E '^[0-9]+$' | sort -nu
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
is_port_in_use() {
|
|
162
|
+
echo "$USED_PORTS" | grep -qx "$1"
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
# 在系统临时端口范围内选第一个空闲端口(不依赖 HOST_PORT 偏移)
|
|
166
|
+
pick_available_sidecar_port() {
|
|
167
|
+
if [ -n "${SIDECAR_HOST_PORT:-}" ]; then
|
|
168
|
+
if ! is_port_in_use "$SIDECAR_HOST_PORT"; then
|
|
169
|
+
echo "$SIDECAR_HOST_PORT"
|
|
170
|
+
return 0
|
|
171
|
+
fi
|
|
172
|
+
echo "sidecar: SIDECAR_HOST_PORT=${SIDECAR_HOST_PORT} already in use" >&2
|
|
173
|
+
return 1
|
|
174
|
+
fi
|
|
175
|
+
|
|
176
|
+
if [ -r /proc/sys/net/ipv4/ip_local_port_range ]; then
|
|
177
|
+
_range=$(cat /proc/sys/net/ipv4/ip_local_port_range)
|
|
178
|
+
else
|
|
179
|
+
_range="32768 60999"
|
|
180
|
+
fi
|
|
181
|
+
_min=$(echo "$_range" | awk '{print $1}')
|
|
182
|
+
_max=$(echo "$_range" | awk '{print $2}')
|
|
183
|
+
|
|
184
|
+
_port="$_min"
|
|
185
|
+
while [ "$_port" -le "$_max" ]; do
|
|
186
|
+
if ! is_port_in_use "$_port"; then
|
|
187
|
+
echo "$_port"
|
|
188
|
+
return 0
|
|
189
|
+
fi
|
|
190
|
+
_port=$((_port + 1))
|
|
191
|
+
done
|
|
192
|
+
return 1
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
# 重建前旁路探活:先枚举已用端口,再绑定空闲端口
|
|
144
196
|
start_sidecar_container() {
|
|
145
197
|
NEXT_NAME="${IMAGE_NAME}-next"
|
|
146
|
-
|
|
198
|
+
TEMP_PORT=""
|
|
147
199
|
|
|
148
200
|
docker rm -f "$NEXT_NAME" 2>/dev/null || true
|
|
149
201
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
202
|
+
USED_PORTS=$(collect_used_ports)
|
|
203
|
+
_used_flat=$(echo "$USED_PORTS" | tr '\n' ' ' | sed 's/ $//')
|
|
204
|
+
echo "sidecar: in-use host ports: ${_used_flat:-none}" >&2
|
|
205
|
+
|
|
206
|
+
TEMP_PORT=$(pick_available_sidecar_port) || TEMP_PORT=""
|
|
207
|
+
|
|
208
|
+
if [ -n "$TEMP_PORT" ]; then
|
|
209
|
+
echo "sidecar: selected free port ${TEMP_PORT}" >&2
|
|
210
|
+
docker run -d --name "$NEXT_NAME" \
|
|
211
|
+
-p "127.0.0.1:${TEMP_PORT}:${CONTAINER_PORT}" \
|
|
212
|
+
-v "${ASSETS_VOL}:/usr/share/nginx/html" \
|
|
213
|
+
-e "ASSET_RETENTION_DAYS=${ASSET_RETENTION_DAYS}" \
|
|
214
|
+
"${IMAGE_NAME}:latest"
|
|
215
|
+
echo "$TEMP_PORT"
|
|
216
|
+
return 0
|
|
155
217
|
fi
|
|
156
218
|
|
|
219
|
+
echo "sidecar: no free port in ephemeral range, fallback to docker auto-assign" >&2
|
|
157
220
|
docker run -d --name "$NEXT_NAME" \
|
|
158
|
-
-p "
|
|
221
|
+
-p "127.0.0.1::${CONTAINER_PORT}" \
|
|
159
222
|
-v "${ASSETS_VOL}:/usr/share/nginx/html" \
|
|
160
223
|
-e "ASSET_RETENTION_DAYS=${ASSET_RETENTION_DAYS}" \
|
|
161
224
|
"${IMAGE_NAME}:latest"
|
|
162
|
-
|
|
163
|
-
if [ -n "${SIDECAR_HOST_PORT:-}" ]; then
|
|
164
|
-
echo "$SIDECAR_HOST_PORT"
|
|
165
|
-
else
|
|
166
|
-
docker port "$NEXT_NAME" "${CONTAINER_PORT}/tcp" | sed 's/.*://'
|
|
167
|
-
fi
|
|
225
|
+
docker port "$NEXT_NAME" "${CONTAINER_PORT}/tcp" | sed 's/.*://'
|
|
168
226
|
}
|
|
169
227
|
|
|
170
228
|
probe_sidecar_before_recreate() {
|