Docker 如何在默认入口点之前执行命令?

Docker 如何在默认入口点之前执行命令?,docker,nginx,Docker,Nginx,我在nginx alpine one上创建了一个docker图像。 我知道,在开始时,nginx映像读取一些配置文件并启动服务器 配置文件(我可以从中看到)读取存储在/etc/nginx中的配置 在实际启动脚本之前,我想对该配置执行一些运行时操作。此配置基于我将在部署描述符中设置的环境变量 我知道我可以简单地覆盖脚本,但是如果在以后的版本中他们更改了它呢?我也必须不断更新它 那么,是否有可能: 执行一些自定义shell指令 是否将命令赋给默认图像入口点 您可以提供一个新的入口点,在默认入口点之前

我在nginx alpine one上创建了一个docker图像。 我知道,在开始时,nginx映像读取一些配置文件并启动服务器

配置文件(我可以从中看到)读取存储在/etc/nginx中的配置

在实际启动脚本之前,我想对该配置执行一些运行时操作。此配置基于我将在部署描述符中设置的环境变量

我知道我可以简单地覆盖脚本,但是如果在以后的版本中他们更改了它呢?我也必须不断更新它

那么,是否有可能:

  • 执行一些自定义shell指令
  • 是否将命令赋给默认图像入口点

  • 您可以提供一个新的入口点,在默认入口点之前运行您想要的任何步骤。听起来您只想在配置文件中插入一些环境变量,这样您就可以在映像构建中通过
    运行
    步骤来实现这一点。

    如果我没有误解您的要求,您的问题涉及以下两点:

  • 您需要根据运行时环境变量更改一些配置,只有在您运行容器时,该变量才会出现
  • 您希望为1执行操作,然后将控制传递给默认入口点。同时,您不想更改默认的
    entrypoint.sh
    ,因为您担心它以后会更改。更改此代码确实很难维护
  • 然后,我建议:将定制的
    docker entrypoint.sh
    包装起来,调用default
    entrypoint.sh
    。下面是想法,只是一个例子:

    • 原始情况:

      Dockerfile:

      FROM alpine
      ...
      ENTRYPOINT ./entrypoint.sh
      
      # do default entrypoint things here
      
      FROM alpine
      ENV myvariable=""
      ...
      ENTRYPOINT ./docker-entrypoint.sh $myvariable
      
      # change the configurations base on the first parameter: $1
      # change configure code here
      
      # call default entrypoint.sh
      ./entrypoint.sh
      
      entrypoint.sh:

      FROM alpine
      ...
      ENTRYPOINT ./entrypoint.sh
      
      # do default entrypoint things here
      
      FROM alpine
      ENV myvariable=""
      ...
      ENTRYPOINT ./docker-entrypoint.sh $myvariable
      
      # change the configurations base on the first parameter: $1
      # change configure code here
      
      # call default entrypoint.sh
      ./entrypoint.sh
      
    • 更新的解决方案可满足您的要求:

      Dockerfile:

      FROM alpine
      ...
      ENTRYPOINT ./entrypoint.sh
      
      # do default entrypoint things here
      
      FROM alpine
      ENV myvariable=""
      ...
      ENTRYPOINT ./docker-entrypoint.sh $myvariable
      
      # change the configurations base on the first parameter: $1
      # change configure code here
      
      # call default entrypoint.sh
      ./entrypoint.sh
      
      docker entrypoint.sh:

      FROM alpine
      ...
      ENTRYPOINT ./entrypoint.sh
      
      # do default entrypoint things here
      
      FROM alpine
      ENV myvariable=""
      ...
      ENTRYPOINT ./docker-entrypoint.sh $myvariable
      
      # change the configurations base on the first parameter: $1
      # change configure code here
      
      # call default entrypoint.sh
      ./entrypoint.sh
      
      使用上述解决方案,您可以基于环境
      myvariable
      在自定义
      docker entrypoint.sh
      中配置代码。同时,即使以后原始图像中的
      entrypoint.sh
      发生更改,它对您来说仍然是透明的,就像您刚才所说的那样,这个脚本没有代码更改


    现在我有一个问题:您的解决方案似乎是正确的,但我正在搜索的文件似乎不存在于容器中……是否有任何命令可以找到它?您是指哪个文件?