【问题标题】:docker - update an image based on a containerdocker - 基于容器更新图像
【发布时间】:2019-04-24 18:23:45
【问题描述】:

每当我使用 docker 容器时,我发现随着项目的增长,我不可避免地需要安装新的 python 包、节点模块和整个 api,如 opencv。

但是当我重建一个 docker 镜像时,我安装的所有新软件和软件包都会被清除 - 因为它们没有在 dockerfile 中指定。

有没有办法用我所做的新安装自动更新 dockerfile,或者创建一个存储 apt-get 包的卷?

【问题讨论】:

    标签: python docker dockerfile node-modules apt


    【解决方案1】:

    我认为docker commit 可能会对您的情况有所帮助

    看看下面的例子:

    • 从基本“alpine”图像创建容器
    • 在容器中添加 tmp 文件
    • 使用“docker commit”并从中创建一个新映像
    • 从自定义映像中启动一个新容器,其中包含之前添加的文件

    [node1] (local) root@192.168.0.8 ~
    $ docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    [node1] (local) root@192.168.0.8 ~
    
    $ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    alpine              latest              196d12cf6ab1        2 months ago        4.41MB
    [node1] (local) root@192.168.0.8 ~$ docker run -it alpine /bin/sh
    / # date > /tmp/now.txt
    / # cat /tmp/now.txt
    Thu Nov 22 08:16:50 UTC 2018
    / # exit
    [node1] (local) root@192.168.0.8 ~
    
    
    $ docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
    6e0913313df1        alpine              "/bin/sh"           25 seconds ago      Exited (0) 4 seconds ago                       practical_knuth
    [node1] (local) root@192.168.0.8 ~
    $ docker commit 6e0913313df1 custom-alpine:123
    sha256:188d17ff3c5577ee858a6d71fbad410bb142fa818e11d0c965cdc634280512e2
    [node1] (local) root@192.168.0.8 ~
    $ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    custom-alpine       123                 188d17ff3c55        4 seconds ago       4.41MB
    alpine              latest              196d12cf6ab1        2 months ago        4.41MB
    [node1] (local) root@192.168.0.8 ~
    
    
    $ docker history custom-alpine:123
    IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
    188d17ff3c55        15 seconds ago      /bin/sh                                         72B
    196d12cf6ab1        2 months ago        /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B
    <missing>           2 months ago        /bin/sh -c #(nop) ADD file:25c10b1d1b41d46a1…   4.41MB
    [node1] (local) root@192.168.0.8 ~
    
    
    $ docker run -it custom-alpine:123 /bin/sh
    / # cat /tmp/now.txt
    Thu Nov 22 08:16:50 UTC 2018
    / # date
    Thu Nov 22 08:18:46 UTC 2018
    / # exit
    [node1] (local) root@192.168.0.8 ~
    $
    

    【讨论】:

      【解决方案2】:

      我安装的所有新软件和软件包都被清除了 - 因为它们没有在 dockerfile 中指定

      这是一个错误:修复它。

      一般来说,您不应该在容器中的交互式 shell 中安装软件。正如您所注意到的,当容器退出时,您将丢失所有工作,并且由于您没有在 Dockerfile 中写下内容,因此您的同事或生产环境没有好的方法来重现您所做的事情。

      我建议以下工作流程:

      1. 在完全不使用 Docker 的情况下构建工作应用程序。确保所有您的语言级依赖项都记录在适当的文件中(package.jsonsetup.pyrequirements.txt)。您应该能够使用源代码树和适当的语言运行时在干净的环境中运行您的应用程序。

      2. 编写一个 Dockerfile 来安装语言运行时、任何所需的主机库依赖项和您的应用程序。生成的图像应该是完全独立的;您永远不需要 docker exec 进入它来做事。

      3. 更新应用程序时,在本地运行测试,然后docker build 新图像,删除旧容器,docker run 新容器。

      如果您浏览 SO 问题,您会看到许多类似于“请在问题中包含您的 Dockerfile”的 cmets。这是一种简单的可复制方式来构建您现在可以与您的同事或您自己在六个月后分享的图像。你永远不应该使用docker commit:这是为你自己设置一个非常特殊的映像的秘诀,你不记得你是如何构建的,因此永远无法更新,一旦你有一个关键的安全更新或新软件,这将是一个问题你需要安装。

      【讨论】:

      • “当你更新你的应用程序时... docker build new images”即使我们决定在本地安装所有需要的包,你有记录这些的好方法吗?或者你只是记住然后重建形象?如果您的应用程序现在需要 opencv,或者需要一组额外的 python 包怎么办?
      • IME 你不会有那么多操作系统级别的依赖,setup.py/requirements.txt 通常就足够了。
      猜你喜欢
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多