启动nginx docker容器时替换文件内容遇sed报错、脚本不执行问题
解决方案
问题2 自定义ENTRYPOINT导致初始化脚本不执行
- 根因:官方Nginx镜像默认入口点为
/docker-entrypoint.sh,只有该脚本会自动执行/docker-entrypoint.d目录下的所有可执行.sh脚本。手动覆盖ENTRYPOINT为Nginx启动命令会直接跳过入口逻辑,导致初始化脚本不执行。 - 解决方法:保留你当前注释ENTRYPOINT的操作即可,官方镜像默认的CMD已经是
nginx -g "daemon off;",无需额外配置启动命令。
问题1 sed提示文件不存在的错误
根因来自3处配置错误,按顺序修改即可:
- 脚本拷贝路径错误:你Dockerfile中使用相对路径
./docker-entrypoint.d拷贝脚本,Nginx镜像默认工作目录不是根目录,会导致脚本被拷贝到错误路径,无法被入口点识别执行。要修改为绝对路径拷贝,同时给脚本添加可执行权限。 - 脚本缺少解释器声明:
myinit.sh没有指定shell解释器,可能被入口点跳过执行。 - 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
相关产品推荐
相关产品推荐

