【问题标题】:Modifying a docker image that was created from an existing one修改从现有镜像创建的 docker 镜像
【发布时间】:2014-11-24 12:40:24
【问题描述】:

按照操作方法,我基于现有图像创建了一个新图像。
我没有原始图像的 Dockerfile,并且在容器启动时发生了一些事情 我无法改变——反正就是这样。

有没有办法修改基础镜像的Dockerfile中的命令?

例如容器在启动时运行一个 bash 脚本,我想更改它。

【问题讨论】:

    标签: docker


    【解决方案1】:

    回答您的具体问题:“容器在启动时运行一个 bash 脚本,我想更改它”。假设您要运行/script.sh(图像的一部分)而不是默认值,您可以使用以下方法实例化容器:

    docker run --entrypoint /script.sh repo/image
    

    如果script.sh 不是图像的一部分和/或您不希望每次都像上面那样使用--entrypoint 明确指定它,您可以准备一个包含并运行您自己的script.sh 的图像:

    1. 创建一个空目录并在其中复制或创建script.sh
    2. 使用以下内容创建Dockerfile

      FROM repo/image
      ADD script.sh /
      ENTRYPOINT /script.sh
      
    3. docker build -t="myimage" .

    4. docker run myimage

    注意事项:

    • 运行容器时(第 4 步),不再需要指定 --entrypoint,因为我们在 Dockerfile 中设置了默认值。
    • 真的就这么简单;无需注册 docker hub 或任何类似的东西(尽管它当然是及时推荐的 ;-)

    【讨论】:

    • 我认为我们还需要权限才能使文件可执行。
    【解决方案2】:

    只需在空目录中创建一个新的 Dockerfile。使用

    启动 Dockerfile
    FROM repo/image 
    

    “repo/image”是您当前使用的图像的 ID。

    并在下方添加您的自定义设置。

    这样您可以构建基于另一个图像的新图像。

    特别是,要更改启动时运行的命令,请放入 CMD 和/或 ENTRYPOINT 行。

    【讨论】:

    • 这个过程是替换基础镜像的 dockerfile 还是只是附加一些东西,这是我在这里错过的东西......谢谢!
    • Dockerfile 包含构建镜像的指令。 Dockerfile 中的FROM xxx/yyy 以图像xxx/yyy 开头,并进一步对其进行自定义。我认为“替换”或“附加”在这里并不适用。
    • 按照我的理解,Dockerfile 很像Makefile,是一系列构建镜像的指令。如果您的Dockerfile 包含ADDCOPY 指令,这些指令针对的是已包含在基本映像中的文件,那么基本文件确实会被“替换”(“分层”可能更准确)。
    【解决方案3】:

    如果使用教程中的命令启动容器失败,则您的基础映像很可能引入了 ENTRYPOINT。您为docker run 指定的任何命令都将作为选项附加到 ENTRYPOINT 命令。因此,给定一个入口点,例如/usr/bin/somescript,

    docker run -d --name newguest -p 8080:80 mymod/httpd:v1 /usr/sbin/httpd -D FOREGROUND
    

    将导致容器执行

    /usr/bin/somescript /usr/sbin/httpd -D FOREGROUND
    

    而不是

    /usr/sbin/httpd -D FOREGROUND
    

    要摆脱 ENTRYPOINT,请使用 --entrypoint 选项:

    docker run --entrypoint "" -d --name newguest -p 8080:80 mymod/httpd:v1 /usr/sbin/httpd -D FOREGROUND
    

    【讨论】:

      猜你喜欢
      • 2019-07-04
      • 2017-09-10
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      相关资源
      最近更新 更多