如何扩展nginx docker映像而不获取错误systemctl:command not found?

如何扩展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映像构建自己的自定义docker映像

我用自己的ENTERYPOINT文件覆盖nginx的入口点

这让我想问两个问题:

  • 我想这样做会丢失nginx的一些命令。我说得对吗?(如暴露端口…)
  • 如果要重新启动nginx,请运行以下命令:
    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文件,该文件将真正执行“重新加载”命令。或者让脚本之类的东西帮你做