我正在写一个创建一个docker文件来在容器中运行openresty nginx。
我的泊坞文件位于下方。
FROM ubuntu:latest
ENV PATH="/usr/local/openresty/nginx/sbin:${PATH}"
LABEL info="running open resty on docker container"
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目录。所以我不确定我在这里缺少什么。
答案 0 :(得分:2)
你的问题很棘手,但我想我已经明白了。
使用此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
。
我相信(我需要在docs / Docker源代码中查看更多内容以确认)CMD
忽略了您在CMD
部分放置的两个“字”中的一个。
正如文档所说,推荐的方法是这样做:
CMD ["executable","param1","param2"]
所以,在你的情况下,你的params
正在做的“更多”而不仅仅是一个参数(当你在那里使用空间时,“更多”)。因此,删除间距并将命令拆分为文档说解决问题的方式。
我不知道您的用例是什么,但如果可以,请尝试使用社区提供的图像。在此示例中,openresty
的所有者维护图像:
https://hub.docker.com/r/openresty/openresty
此外,它们提供了有关如何运行它的良好文档。
希望它有所帮助!