@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.
Files changed (2) hide show
  1. package/deploy-docker.sh +72 -14
  2. 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
- # 重建前旁路探活:127.0.0.1 上由 Docker 分配空闲宿主机端口(无固定偏移)
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
- _publish="127.0.0.1::${CONTAINER_PORT}"
198
+ TEMP_PORT=""
147
199
 
148
200
  docker rm -f "$NEXT_NAME" 2>/dev/null || true
149
201
 
150
- if [ -n "${SIDECAR_HOST_PORT:-}" ]; then
151
- _publish="127.0.0.1:${SIDECAR_HOST_PORT}:${CONTAINER_PORT}"
152
- echo "sidecar: using fixed port ${SIDECAR_HOST_PORT}" >&2
153
- else
154
- echo "sidecar: binding ephemeral free port on 127.0.0.1" >&2
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 "$_publish" \
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() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dazhicheng/common",
3
- "version": "1.0.46",
3
+ "version": "1.0.47",
4
4
  "description": "共享配置文件",
5
5
  "type": "module",
6
6
  "types": "./src/types/index.d.ts",