Node.js nginx:无效选项:“0”;关「;和entrypoint.sh::权限被拒绝

Node.js nginx:无效选项:“0”;关「;和entrypoint.sh::权限被拒绝,node.js,linux,bash,docker,nginx,Node.js,Linux,Bash,Docker,Nginx,我使用Dockerfile创建构建,然后通过jenkins作业部署该构建/映像,但容器状态为“CrashLoopBackOff”,当我检查日志时,出现以下错误 错误:- nginx: invalid option: "off" /etc/nginx/entrypoint.sh: 5: /etc/nginx/entrypoint.sh: : Permission denied 注意:-授予entrypoint.sh完全权限。(检查dockerfile) Dockerfile

我使用Dockerfile创建构建,然后通过jenkins作业部署该构建/映像,但容器状态为“CrashLoopBackOff”,当我检查日志时,出现以下错误

错误:-

nginx: invalid option: "off"
/etc/nginx/entrypoint.sh: 5: /etc/nginx/entrypoint.sh: : Permission denied 
注意:-授予entrypoint.sh完全权限。(检查dockerfile)

Dockerfile:-

FROM node:12.18.4-alpine AS BUILD_IMAGE
WORKDIR /app

# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH

COPY package.json .
COPY package-lock.json .
COPY .npmrc .
RUN npm install
COPY . .
RUN npm run build

FROM nginx:latest
RUN apt-get update
RUN apt-get -y install sudo
COPY --from=BUILD_IMAGE /app/build /usr/share/nginx/html
COPY nginx/nginx.conf /etc/nginx/conf.d/default.conf
COPY .build/envs/uat/env.js /app/uat/env.js
COPY .build/envs/prod/env.js /app/prod/env.js
COPY entrypoint.sh /etc/nginx/entrypoint.sh
RUN  sudo chmod 777 /etc/nginx/entrypoint.sh
RUN  sudo nginx -t
RUN  ls -lrt /etc/nginx/

EXPOSE 80
ENTRYPOINT ["/etc/nginx/entrypoint.sh"]
# replace ENVIRONMENT with uat, prod
CMD ["ENVIRONMENT"]

entrypoint.sh文件:-

#!/bin/sh
set -e

if [ "$1" = 'uat' ]; then
    "$(cp /app/uat/env.js /usr/share/nginx/html && nginx -g daemon off;)"
elif [ "$1" = 'prod' ]; then
    "$(cp /app/prod/env.js /usr/share/nginx/html && nginx -g daemon off; )"
fi
  • 检查目录(/app)是否已创建。如果没有,请在cfg文件中使用下面的语句,并授予该目录的权限
  • 同时在入口点脚本中授予权限
  • 要使容器加速,请在入口点脚本中使用无限循环,并将其复制到相应的位置,然后重新启动容器,然后进行调试
  • 入口点脚本:

    #!/bin/sh
    while true; do sleep 120; done
    
    复制命令:

    docker cp <entry point script path> <container_name>:<path to copy the script in container>
    
    docker restart <container_name>
    
    docker cp:
    docker重新启动
    
    我花了几个小时。 nginx映像的最新版本需要调用/docker-entrypoint.sh

    #我的入口点
    #做点什么
    #做另一件事
    #....
    #不要直接运行“exec$@”,而是运行:
    exec/docker-entrypoint.sh$@
    
    不要玩CMD。将其保留为默认值

    重要的一点:自从nginx1.19 自从nginx1.19以来,默认入口点中有很多特性,可以让我摆脱自定义入口点

    e、 g:支持nginx配置模板文件

    default.conf.template

    
    http {
      listen ${MY_PORT}
    
    }
    
    FROM nginx:1.19-alpine
    ENV MY_PORT=80
    COPY default.conf.template /etc/nginx/templates/
    
    Dockerfile

    
    http {
      listen ${MY_PORT}
    
    }
    
    FROM nginx:1.19-alpine
    ENV MY_PORT=80
    COPY default.conf.template /etc/nginx/templates/
    
    构建它,然后运行:

    docker运行myimage
    #-->将在80上运行(请参阅dockerfile)
    docker run-e MY_PORT=8080 myimage
    #-->将在8080上运行(请参阅-e MY_端口)
    
    如果您特别想了解此功能的逻辑,请执行容器并检查此脚本的内容
    /docker entrypoint.d/20 envsubst on templates.sh

    更多详情:


    'daemon off;'
    需要被引用才能成为单个shell单词。(我建议使用
    docker run-v
    bind mount在部署时插入适当的配置文件,并使用base
    nginx
    映像中的命令。您还可以从该设置中完全删除
    sudo
    。)