docker-根据容器更新图像

时间:2018-11-22 05:54:57

标签: python docker dockerfile node-modules apt

每当我使用Docker容器时,我都会发现随着项目的发展,不可避免地我将需要安装新的python软件包,节点模块以及像opencv这样的整个api。

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

是否可以使用我进行的新安装自动更新dockerfile或创建一个存储apt-get软件包的卷?

2 个答案:

答案 0 :(得分:0)

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

查看以下示例:

  • 从基本“高山”图片创建容器
  • 在容器中添加一个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 ~
$

答案 1 :(得分:0)

  

我安装的所有新软件和软件包都被删除了-因为未在dockerfile中指定

那是一个错误:修复它。

通常,您不应在容器的交互式外壳中安装软件。正如您所注意到的,当容器退出时,您将失去所有工作,并且由于您还没有在Dockerfile中写下内容,因此您的同事或生产环境没有很好的方法来重现您所做的事情。 / p>

我建议工作流程为:

  1. 无需使用Docker即可构建可运行的应用程序。确保所有语言级别的依存关系都记录在适当的文件中(package.jsonsetup.pyrequirements.txt)。您应该能够在干净的环境中使用源代码树和适当的语言运行时来运行应用程序。

  2. 编写一个Dockerfile,该文件安装语言运行时,所有必需的主机库依赖项以及您的应用程序。生成的图像应完全独立。您永远不需要docker exec来做事。

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

如果您浏览SO 个问题,则会看到许多注释,例如“请在问题中包含Dockerfile”。这是一种建立图像的简单,可复制的方法,您现在可以与您或六个月后与您的同事共享图像。您永远不要使用docker commit:这是为自己准备一个非常特殊的图像的诀窍,您不记得自己是如何构建的,因此也永远无法更新,一旦您进行了重要的安全更新或您需要安装的新软件。