nginx docker文件无法打开文件

我正在编写一个docker文件,在容器中运行openresty nginx。

我的docker文件如下。

FROM ubuntu:latest

ENV PATH="/usr/local/openresty/nginx/sbin:${PATH}"

LABEL info="在docker容器中运行openresty"

RUN  apt-get update -y \
     && apt-get install -y wget \
     && wget -qO - https://openresty.org/package/pubkey.gpg | apt-key add - \
     && apt-get -y install software-properties-common \
     && add-apt-repository -y "deb http://openresty.org/package/ubuntu $(lsb_release -sc) main" \
     && apt-get update -y \
     && apt-get install -y openresty
RUN mkdir -p /opt/poc

RUN cd /opt/poc \
       && mkdir logs \
       && touch logs/error.log \
       && mkdir conf \
       && cd ../

RUN chmod -R 755 /opt/poc
WORKDIR /opt/poc

ADD ./conf/nginx.conf conf/

EXPOSE 8383

CMD ["nginx", "-p /opt/poc","-c conf/nginx.conf"]

镜像没有问题。但是当我运行docker时,我得到以下错误消息。

nginx:[alert]无法打开错误日志文件:open()“ /opt/poc/logs/error.log”失败(2:没有该文件或目录) 2017/09/23 03: 35: 44 [emerg] 1 #1:open()“/opt/poc/conf/nginx.conf” 失败(2:没有该文件或目录)

如果我将“CMD ["nginx", "-p /opt/poc","-c conf/nginx.conf"]”更改为“CMD $ls”,则docker将列出conf和logs目录。所以我不确定我错过了什么。

点赞
用户2624575
用户2624575

你的问题很棘手,但我认为我已经解决了。

简短回答

使用这个命令 (CMD)(在 -p-c 标志中没有空格)

CMD ["nginx", "-g", "daemon off;", "-p", "/opt/poc", "-c", "conf/nginx.conf"]

-g daemon off; 标志将 nginx 链接为前置进程。否则,如果这个进程作为守护进程运行,你的容器会在 nginx 启动后立即死亡。

长回答

当你将任何空格分隔的字符串加入到任何 CMD 命令中时,就会出现问题。在你的例子中,分别是 -p /opt/poc-c conf/nginx.conf

我相信(我需要查看更多的文档 / Docker 源代码来确认),在你的 CMD 部分中,CMD 将忽略其中一个“单词”。

正如文档所说,推荐的方式是这样的:

CMD ["executable","param1","param2"]

所以,在你的情况下,你的参数执行了“更多”的操作(添加空格实际上是一个额外的操作)。因此,删除空格并按照文档中的方式分隔命令就可以解决该问题。

提示

我不知道你的用例是什么,但如果可以的话,尝试使用社区提供的镜像。在这个例子中,openresty 的所有者维护这些镜像:

https://hub.docker.com/r/openresty/openresty

此外,他们还提供了一个良好的运行文档。

希望可以帮到你!

2017-09-23 04:40:11