如何扩展nginx docker映像而不获取错误systemctl:command not found?
我想从nginx映像构建自己的自定义docker映像 我用自己的ENTERYPOINT文件覆盖nginx的入口点 这让我想问两个问题:如何扩展nginx docker映像而不获取错误systemctl:command not found?,docker,nginx,Docker,Nginx,我想从nginx映像构建自己的自定义docker映像 我用自己的ENTERYPOINT文件覆盖nginx的入口点 这让我想问两个问题: 我想这样做会丢失nginx的一些命令。我说得对吗?(如暴露端口…) 如果要重新启动nginx,请运行以下命令:nginx-t&&systemctl reload nginx。但结果是: nginx:configuration file/etc/nginx/nginx.conf测试成功 /entrypoint.sh:第5行:未找到systemctl:命令 如何解决
nginx-t&&systemctl reload nginx
。但结果是:
nginx:configuration file/etc/nginx/nginx.conf测试成功
/entrypoint.sh:第5行:未找到systemctl:命令
FROM nginx:latest
WORKDIR /
RUN echo "deb http://ftp.debian.org/debian stretch-backports main" >> /etc/apt/sources.list
RUN apt-get -y update && \
apt-get -y install apt-utils && \
apt-get -y upgrade && \
apt-get -y clean
# I ALSO WANT TO INSTALL CERBOT FOR LATER USE (in my entrypoint file)
RUN apt-get -y install python-certbot-nginx -t stretch-backports
# COPY ./something ./tothisimage
# COPY ./something ./tothisimage
# COPY ./something ./tothisimage
# COPY ./something ./tothisimage
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["bash", "/entrypoint.sh"]
entrypoint.sh
echo "in entrypoint"
# I want to run some commands here...
# After I want to run nginx normally....
nginx -t && systemctl reload nginx
echo "after reload"
这将使用
service
命令工作:
echo "in entrypoint"
# I want to run some commands here...
# After I want to run nginx normally....
nginx -t && service nginx reload
echo "after reload"
输出:
in entrypoint
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Restarting nginx: nginx.
after reload
这将使用
service
命令工作:
echo "in entrypoint"
# I want to run some commands here...
# After I want to run nginx normally....
nginx -t && service nginx reload
echo "after reload"
输出:
in entrypoint
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Restarting nginx: nginx.
after reload
像
service
和systemctl
这样的命令在Docker中通常不起作用,您应该完全忽略它们
在entrypoint脚本运行时,它实际上是唯一正在运行的东西。这意味着您不需要重新启动nginx,因为它还没有第一次启动。这里的标准模式是使用entrypoint脚本进行一些首次设置;它将被传递实际的命令作为参数运行,因此您需要告诉它运行它们
#/垃圾箱/垃圾箱
回声“在入口点”
# ... 做第一次安装。。。
#…然后运行命令nginx或其他命令
执行官“$@”
(尝试运行docker run--rm-it myimage/bin/sh
。您将在新容器中获得一个交互式shell,但在第一次安装之后。)
Dockerfile中丢失的一件事是基本映像中的默认CMD
(设置ENTRYPOINT
会重置它)。您需要重新添加:
复制entrypoint.sh/entrypoint.sh
运行chmod+x/entrypoint.sh
入口点[“/ENTRYPOINT.sh”]
CMD[“nginx”,“-g”,“守护进程关闭;”]
您应该保留基础映像中的其他设置,如
ENV
定义和EXPOSE
d端口。像service
和systemctl
这样的命令在Docker中基本不起作用,您应该完全忽略它们
在entrypoint脚本运行时,它实际上是唯一正在运行的东西。这意味着您不需要重新启动nginx,因为它还没有第一次启动。这里的标准模式是使用entrypoint脚本进行一些首次设置;它将被传递实际的命令作为参数运行,因此您需要告诉它运行它们
#/垃圾箱/垃圾箱
回声“在入口点”
# ... 做第一次安装。。。
#…然后运行命令nginx或其他命令
执行官“$@”
(尝试运行docker run--rm-it myimage/bin/sh
。您将在新容器中获得一个交互式shell,但在第一次安装之后。)
Dockerfile中丢失的一件事是基本映像中的默认CMD
(设置ENTRYPOINT
会重置它)。您需要重新添加:
复制entrypoint.sh/entrypoint.sh
运行chmod+x/entrypoint.sh
入口点[“/ENTRYPOINT.sh”]
CMD[“nginx”,“-g”,“守护进程关闭;”]
您应该保留基本映像中的其他设置,如ENV
定义和EXPOSE
d端口。systemctl命令特定于某些基于SystemD的操作系统。但是您没有在PID 1上运行这样一个SystemD守护进程,所以即使您安装了这些软件包,它也不会工作
您只能签入nginx.service文件,该文件将真正执行“重新加载”命令。或者让脚本之类的东西为您执行此操作。该“systemctl”命令特定于某些基于SystemD的操作系统。但是您没有在PID 1上运行这样一个SystemD守护进程,所以即使您安装了这些软件包,它也不会工作
您只能签入nginx.service文件,该文件将真正执行“重新加载”命令。或者让脚本之类的东西帮你做