如何覆盖默认的docker容器命令或恢复到以前的容器状态?

如何覆盖默认的docker容器命令或恢复到以前的容器状态?,docker,Docker,我有一个docker镜像运行wordpress安装。映像由apache服务器作为默认命令执行。因此,当您停止apache服务时,容器将退出 问题出现在apache服务器配置混乱之后。容器无法启动,我无法恢复图像内容 我的选项是覆盖容器运行的命令或将上次文件系统更改恢复到以前的状态 这些事情有可能吗?备选方案?当您使用docker run启动容器时,您可以提供一个在容器内运行的命令。这将覆盖图像中指定的任何命令。例如: docker run -it some/container bash 如果修

我有一个docker镜像运行wordpress安装。映像由apache服务器作为默认命令执行。因此,当您停止apache服务时,容器将退出

问题出现在apache服务器配置混乱之后。容器无法启动,我无法恢复图像内容

我的选项是覆盖容器运行的命令或将上次文件系统更改恢复到以前的状态


这些事情有可能吗?备选方案?

当您使用
docker run启动容器时,您可以提供一个在容器内运行的命令。这将覆盖图像中指定的任何命令。例如:

docker run -it some/container bash
如果修改了容器内的配置,则不会影响图像的内容。因此,您只需从原始映像启动一个新容器即可“恢复文件系统更改”……在这种情况下,您仍然可以使用原始映像


容器内的更改影响图像的唯一方法是使用
docker commit
命令生成包含在容器中所做更改的新图像。

有不同的方法覆盖docker图像的默认命令。这里有两个:

  • 如果您有一个带有默认CMD命令的图像,只需在
    docker run
    中覆盖它,并将希望运行的命令(及其参数)作为最后一个参数(
    用法:docker run[OPTIONS]image[command][ARG…])
  • 使用
    BASE
    映像创建一个包装器映像,该映像是要覆盖
    CMD
    入口点的映像。范例

    来自我的图片
    CMD[“我的新CMD”]

  • 此外,您还可以尝试以不同的方式还原更改:

  • 如果您有要还原的映像的Dockerfile,只需将更改重写为Dockerfile,然后再次运行
    docker build
    过程
  • 如果您没有docker文件,并且构建了提交更改的映像,则可以使用
    docker history:tag
    ,找到所需提交的映像ID,并使用您希望的名称(和标记)运行该提交或提交的标记(如果覆盖标记名,则使用
    -f
    选项)。例如:
  • $docker history docker\u io\u软件包:最新版本


    $docker tag-f c7b38f258a80 docker_io__包:最新

    如果您只想复制内容,可以使用下面的命令和更具体的路径

    sudo docker cp containername:/var//varbackup/

    文件系统也可以从主机访问。运行下面的命令,在底部的“卷”部分,它应该有一个存储文件系统修改的路径。
    这不是一个好的永久解决方案。

    码头工人检查集装箱名称

    如果以后重新创建容器,则应考虑将数据保留在容器外部,并在创建容器时将其作为虚拟路径链接到容器中。如果以这种方式将apache配置文件链接到容器中,则可以在容器未运行时对其进行编辑

    管理容器中的数据

    编辑1:不建议将此作为最佳实践,但它应该有效。
    这将显示主机上apache2.conf的路径。
    用您的容器名称替换一些wordpress。

    CONTAINER_ID=$(docker inspect -f   '{{.Id}}' some-wordpress)
    sudo find /var/lib/docker/ -name apache2.conf | grep $CONTAINER_ID
    

    例如,如果需要使用一组参数启动命令

    ls-al/bin

    试着这样做

    docker运行——入口点ls-it debian/bin-al


    其中,
    ls
    --entrypoint
    之后,所有参数都放在图像名称之后

    TL;因此,我应该提交生成映像的容器,并在命令行提示符下从创建的映像重新运行新容器。对吗?如果您的目标是保存在现有容器中所做的更改,是的,这应该可以做到。这里的问题是我无法附加到图像。一旦启动,它就会退出。它最后报告:“状态不可用于容器[…]容器可能已被清理[…]”。我已经能够按照@nathan smith的建议将内容复制出来。如果我可以覆盖容器中的apache2.conf文件,我就能够纠正这个问题。似乎您可以通过使用
    FROM
    复制apache2.conf/path/to/apache2.conf
    来解决这个问题。情况并非如此。这是一个有重大更改的构建映像。在这种情况下,我将从损坏的映像开始,修复问题并保存它,同时修复问题。您可以这样做:a)使用
    docker run-it myimage/bin/bash启动映像,修复映像,然后提交
    docker commit my_映像:mytag
    ;或者b)使用图像中的
    docker文件
    ,修复docker文件,然后使用
    docker build
    再次构建它,关键是我无法修复该问题。该容器作为命令在apache服务器上运行。apache配置错误,因此容器一启动就退出。因此,除非我找到在容器中重写apache2.conf的方法,否则我必须从头开始重新生成图像。请在您的问题中添加
    docker inspect
    Thank@nathan smith的输出,我已经能够使用cp命令提取内容。有没有办法覆盖容器内的文件?我的问题是apache2.conf文件配置错误。如果我可以覆盖它就可以了。我知道文件在哪里,但我需要用主机上的文件覆盖容器副本。cp命令允许执行相反的操作。这可以用来备份内容。不确定如何设置评论的格式,所以我在上面编辑了我的帖子。apache.conf的路径类似于/var/lib/docker/aufs/diff/019afa3b3f32f32f85aef4214fe22300932a1afd130a6da1745304884