You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启动nginx docker容器时替换文件内容遇sed报错、脚本不执行问题

解决方案

问题2 自定义ENTRYPOINT导致初始化脚本不执行

  • 根因:官方Nginx镜像默认入口点为/docker-entrypoint.sh,只有该脚本会自动执行/docker-entrypoint.d目录下的所有可执行.sh脚本。手动覆盖ENTRYPOINT为Nginx启动命令会直接跳过入口逻辑,导致初始化脚本不执行。
  • 解决方法:保留你当前注释ENTRYPOINT的操作即可,官方镜像默认的CMD已经是nginx -g "daemon off;",无需额外配置启动命令。

问题1 sed提示文件不存在的错误

根因来自3处配置错误,按顺序修改即可:

  1. 脚本拷贝路径错误:你Dockerfile中使用相对路径./docker-entrypoint.d拷贝脚本,Nginx镜像默认工作目录不是根目录,会导致脚本被拷贝到错误路径,无法被入口点识别执行。要修改为绝对路径拷贝,同时给脚本添加可执行权限。
  2. 脚本缺少解释器声明:myinit.sh没有指定shell解释器,可能被入口点跳过执行。
  3. Alpine系统sed语法不兼容:Alpine自带的busybox版本sed的-i参数要求必须指定备份后缀,哪怕是空后缀也要显式声明,否则会把后续路径参数当成后缀,提示文件不存在。

修改后的配置文件

Dockerfile

# 1.) build
FROM node:14.16.1-alpine3.13 AS builder
WORKDIR /app
COPY . .

# 2.) target image
FROM nginx:1.21.3-alpine
# 改为绝对路径拷贝脚本,添加可执行权限
COPY --from=builder /app/myinit.sh /docker-entrypoint.d/
RUN chmod +x /docker-entrypoint.d/myinit.sh
COPY --from=builder /app/env.js /usr/share/nginx/html

myinit.sh

#!/bin/sh
# 适配busybox sed语法,变量用双引号包裹避免特殊字符异常
sed -i '' "s~__env.apiUrlRoot.*~__env.apiUrlRoot = '$MYENV';~g" /usr/share/nginx/html/env.js

如果你希望沿用原有sed语法,也可以在Dockerfile中安装GNU版本sed:

# 加在COPY myinit.sh的步骤之后
RUN apk add --no-cache sed

修改后重新执行构建启动命令即可正常运行。

内容的提问来源于stack exchange,提问作者QStorm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:06:03