每当我使用Docker容器时,我都会发现随着项目的发展,不可避免地我将需要安装新的python软件包,节点模块以及像opencv这样的整个api。
但是当我重建docker映像时,我安装的所有新软件和软件包都会被删除-因为未在dockerfile中指定它们。
是否可以使用我进行的新安装自动更新dockerfile或创建一个存储apt-get软件包的卷?
答案 0 :(得分:0)
我认为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>
我建议工作流程为:
无需使用Docker即可构建可运行的应用程序。确保所有语言级别的依存关系都记录在适当的文件中(package.json
,setup.py
,requirements.txt
)。您应该能够在干净的环境中使用源代码树和适当的语言运行时来运行应用程序。
编写一个Dockerfile,该文件安装语言运行时,所有必需的主机库依赖项以及您的应用程序。生成的图像应完全独立。您永远不需要docker exec
来做事。
在更新应用程序时,请在本地运行其测试,然后docker build
个新映像,删除旧容器,以及docker run
个新容器。
如果您浏览SO docker个问题,则会看到许多注释,例如“请在问题中包含Dockerfile”。这是一种建立图像的简单,可复制的方法,您现在可以与您或六个月后与您的同事共享图像。您永远不要使用docker commit
:这是为自己准备一个非常特殊的图像的诀窍,您不记得自己是如何构建的,因此也永远无法更新,一旦您进行了重要的安全更新或您需要安装的新软件。