【问题标题】:nginx: invalid option: "off" and entrypoint.sh: : Permission deniednginx:无效选项:“off”和entrypoint.sh::权限被拒绝
【发布时间】:2021-01-31 04:12:57
【问题描述】:

我正在使用 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

【问题讨论】:

  • 'daemon off;' 需要被引用才能成为一个shell word。
  • (我建议使用docker run -v绑定挂载在部署时注入适当的配置文件,并使用基础nginx映像中的命令。您也可以完全删除sudo从这个设置。)

标签: node.js linux bash docker nginx


【解决方案1】:
  1. 检查目录(/app)是否已创建。如果不在 cfg 文件中使用以下语句并授予该目录的权限
RUN mkdir -p /app

RUN chmod -R 777 /app
  1. 还要在入口点脚本中授予权限
#!/bin/sh
set -e

chmod -R 777 /app

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
  1. 要让容器启动,请在入口点脚本中使用无限循环并将​​其复制到相应位置并重新启动容器,然后才能进行调试

入口点脚本:

#!/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>

【讨论】:

    【解决方案2】:

    我花了几个小时。 最新版本的 nginx 镜像需要调用 /docker-entrypoint.sh

    # my entrypoint
    
    # do something
    # do another thing
    #....
    
    # DON't run "exec $@" directly but run:
    exec /docker-entrypoint.sh $@
    
    

    不要玩 CMD。保持默认。

    重点:从 nginx 1.19 开始

    从 nginx 1.19 开始,默认入口点中有很多功能可以让我摆脱自定义入口点。

    例如:支持 nginx 配置模板文件

    default.conf.template

    
    http {
      listen ${MY_PORT}
    
    }
    

    Dockerfile

    FROM nginx:1.19-alpine
    ENV MY_PORT=80
    COPY default.conf.template /etc/nginx/templates/
    

    构建然后运行:

    docker run myimage
    #--> will run on 80 ( see dockerfile)
    docker run -e MY_PORT=8080 myimage
    #--> will run on 8080 ( see -e MY_PORT)
    

    如果你对这个特性的具体逻辑感到好奇,可以执行到容器并检查这个脚本的内容/docker-entrypoint.d/20-envsubst-on-templates.sh

    更多细节:

    【讨论】:

    猜你喜欢
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 2021-03-27
    • 2017-11-03
    • 2016-03-26
    • 2020-02-08
    • 2014-03-31
    相关资源
    最近更新 更多