以编程方式从停止的Docker容器中删除文件

时间:2020-07-23 15:39:11

标签: docker

我有一个运行mongoDB的docker容器无法启动。我搜索并意识到这是由于mongoDB无法在容器中启动而引起的。

搜索后,使mongoDB重新工作的解决方案似乎非常简单,如以下响应所示:MongoDB Failing to Start - ***aborting after fassert() failure。 显然,我要做的就是删除导致mongoDB崩溃的文件: /tmp/mongodb-27017.sock

我已经看到了可以在容器docker exec -t -i mycontainer /bin/bash中访问shell的响应,但是该容器必须正在运行。

如果容器未运行,是否可以删除特定文件?

1 个答案:

答案 0 :(得分:0)

要将命令运行到已停止的容器中,您可以做的是:

  • 将容器的当前状态提交到新图像
  • 使用您喜欢的命令启动新容器

但是从技术上讲,这是一个不好的做法。容器应该是不变的,您可以重新创建容器。如果文件位于持久卷中,则docker commit解决方案仍然可以正常工作,并将该卷装载到另一个容器上并从那里开始工作。

所以我们做吧:

#vibrant_tu being the name of a stopped container I have
$ docker commit vibrant_tu
sha256:3381382dc88be0955b76439a74e7d6c41b41ae7217a807d20c4bc92d55e76093
$ docker run -ti 3381382dc88be0955b76439a74e7d6c41b41ae7217a807d20c4bc92d55e76093 sh
# #Do what you want to do in the shell like deleting the file then exit

请注意,如果没有卷,则仅在新容器中进行修改:

$ docker container ls -a
CONTAINER ID        IMAGE                                 COMMAND                     CREATED             STATUS                     PORTS               NAMES
30c3bee77ed2        3381382dc88b                          "sh"                        2 minutes ago       Exited (0) 2 minutes ago                       epic_williamson    
$ docker start 30c3bee77ed2

但是,如果计划不修改卷数据,那么这样做根本就没有意义,您可能只是创建了另一个容器。

当需要使用外壳检查停止的容器时,此技巧仍然很有用。

相关问题