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

时间:2015-02-22 23:05:20

标签: docker

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

麻烦服务器配置搞乱后问题出现了。容器无法启动,我无法恢复图像内容。

我的选择是覆盖容器运行的命令或将上次文件系统更改还原为以前的状态。

这些事情有可能吗?替代?

4 个答案:

答案 0 :(得分:2)

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

  

sudo docker cp containername:/ var / / varbackup /

https://docs.docker.com/reference/commandline/cli/#cp

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

  

docker inspect containername

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

管理容器中的数据
http://docs.docker.com/userguide/dockervolumes/

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

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

答案 1 :(得分:1)

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

docker run -it some/container bash

如果您修改了容器中的配置,则不会影响图像的内容。所以你可以恢复文件系统的变化"只需从原始图像中启动一个新容器...在这种情况下,您仍然可以使用原始图像。

如果您使用docker commit命令生成包含您在容器中所做更改的 new 图像,则容器内部更改的唯一方法会影响图像。

答案 2 :(得分:1)

有多种方法可以覆盖泊坞窗图像的默认命令。这里有两个:

  1. 如果你有一个带有默认CMD命令的图像,你可以简单地在docker run覆盖它作为最后一个参数给你想要运行的命令(及其参数)(Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  2. 使用BASE图片创建一个包装图片,将其覆盖为CMDENTRYPOINT。实施例

    FROM my_image CMD ["my-new-cmd"]

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

    1. 如果您要恢复映像的Dockerfile,只需将更改重写为Dockerfile并再次运行docker build进程。
    2. 如果您没有Dockerfile并且构建了提交更改的映像,则可以使用docker history <IMAGE_NAME>:tag,找到所需提交的IMAGE_ID,然后运行提交的提交或标记您希望的名称(和标记)(如果要覆盖标记名称,则使用-f选项)。例如:
    3. $ docker history docker_io_package:latest

      $ docker tag -f c7b38f258a80 docker_io_package:latest

答案 3 :(得分:0)

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

ls -al /bin

尽量做到这一点

docker run --entrypoint ls -it debian /bin -al

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