2024-04-25 09:53:08 发布
网友
每当我使用docker容器时,我发现随着项目的增长,不可避免地需要安装新的python包、节点模块和opencv等整个api。在
但是当我重建一个docker镜像时,我安装的所有新软件和软件包都会被清除掉——因为它们没有在dockerfile中指定。在
有没有办法用我所做的新安装自动更新dockerfile,或者创建一个存储apt-get包的卷?在
all of the new software and packages that I installed get wiped out - as they are not specified in the dockerfile
这是一个错误:修复它。在
一般来说,您不应该在容器中的交互式shell中安装软件。正如您所注意到的,当容器退出时,您将丢失所有的工作,而且由于您还没有在Dockerfile中写下东西,所以您的同事或您的生产环境没有好的方法来重现您所做的工作。在
我建议工作流程如下:
不使用Docker构建一个工作应用程序。确保所有的语言级依赖项都记录在适当的文件(package.json,setup.py,requirements.txt)中。您应该能够使用源代码树和适当的语言运行库在干净的环境中运行应用程序。
package.json
setup.py
requirements.txt
编写一个Dockerfile来安装语言运行时、任何必需的主机库依赖项和应用程序。生成的图像应该是完全自包含的;您不应该需要docker exec来做事情。
docker exec
更新应用程序时,在本地运行其测试,然后docker build新映像,删除旧容器,docker run个新容器。
docker build
docker run
如果你浏览一下SOdocker问题,你会看到很多评论,内容大致是“请在问题中包含你的Dockerfile”。六个月后,你可以和你的同事分享一个可复制的形象。你不应该使用docker commit:这是一个为你自己设置一个非常特殊的映像的方法,你不记得你是如何构建的,因此永远无法更新,一旦你有了一个关键的安全更新或需要安装的新软件,这将是一个问题。在
docker commit
我想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 ~ $
这是一个错误:修复它。在
一般来说,您不应该在容器中的交互式shell中安装软件。正如您所注意到的,当容器退出时,您将丢失所有的工作,而且由于您还没有在Dockerfile中写下东西,所以您的同事或您的生产环境没有好的方法来重现您所做的工作。在
我建议工作流程如下:
不使用Docker构建一个工作应用程序。确保所有的语言级依赖项都记录在适当的文件(
package.json
,setup.py
,requirements.txt
)中。您应该能够使用源代码树和适当的语言运行库在干净的环境中运行应用程序。编写一个Dockerfile来安装语言运行时、任何必需的主机库依赖项和应用程序。生成的图像应该是完全自包含的;您不应该需要
docker exec
来做事情。更新应用程序时,在本地运行其测试,然后
docker build
新映像,删除旧容器,docker run
个新容器。如果你浏览一下SOdocker问题,你会看到很多评论,内容大致是“请在问题中包含你的Dockerfile”。六个月后,你可以和你的同事分享一个可复制的形象。你不应该使用
docker commit
:这是一个为你自己设置一个非常特殊的映像的方法,你不记得你是如何构建的,因此永远无法更新,一旦你有了一个关键的安全更新或需要安装的新软件,这将是一个问题。在我想docker commit可能对你的案子有帮助
请查看以下示例:
相关问题 更多 >
编程相关推荐