nginx:无效选项:“关闭”和entrypoint.sh::权限被拒绝

时间:2020-10-16 15:55:01

标签: 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:-

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

2 个答案:

答案 0 :(得分:0)

  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>

答案 1 :(得分:0)

我花了几个小时。 最新版本的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的内容

更多详细信息: