如何覆盖默认 docker 容器命令或恢复到以前的容器状态?
How to override default docker container command or revert to previous container state?
我有一个 docker 图片 运行 一个 wordpress 安装。该图像通过执行 apache 服务器作为默认命令。因此,当您停止 apache 服务时,容器将退出。
问题出现在弄乱 apache 服务器配置之后。容器无法启动,无法恢复镜像内容
我的选择是覆盖容器运行的命令或将上次文件系统更改恢复到以前的状态。
这些事情有可能吗?备选方案?
当您使用 docker run
启动容器时,您可以在容器内向 运行 提供命令。这将覆盖图像中指定的任何命令。例如:
docker run -it some/container bash
如果您修改了容器内的配置,不会影响图像的内容。因此,您可以 "revert the filesystem changes" 只需从原始图像启动一个新容器...在这种情况下,您仍然可以使用 原始 图像。
如果您使用 docker commit
命令生成一个 new 包含您在容器。
有多种方法可以覆盖 docker 图像的默认命令。这里有两个:
- 如果您有一个带有默认 CMD 命令的图像,您可以简单地在
docker run
中覆盖它,将您希望 运行 (Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
)
使用 BASE
图像创建一个包装图像,您要覆盖 CMD
或 ENTRYPOINT
。例子
FROM my_image
CMD ["my-new-cmd"]
此外,您可以尝试以不同的方式还原更改:
- 如果您有要还原的映像的 Dockerfile,只需将更改重写到 Dockerfile 中,然后 运行 再次
docker build
处理。
- 如果您没有 Dockerfile 并且构建了提交更改的映像,则可以使用
docker history <IMAGE_NAME>:tag
,找到您想要的提交的 IMAGE_ID,然后 运行使用您希望的名称(和标签)提交的提交或标签(如果您要覆盖标签名称,请使用 -f
选项)。示例:
$ docker history docker_io_package:latest
$ docker tag -f c7b38f258a80 docker_io_package:latest
如果您只想将内容复制出来,您可以使用下面的命令和更具体的路径。
sudo docker cp containername:/var/ /varbackup/
https://docs.docker.com/reference/commandline/cli/#cp
也可以从主机访问文件系统。 运行 下面的命令和底部的卷部分中它应该有一个存储文件系统修改的路径。
这不是一个好的永久解决方案。
docker inspect containername
如果您稍后重新创建容器,您应该考虑将数据保存在容器之外,并在创建容器时link将其作为虚拟路径放入容器中。如果您 link 通过这种方式将您的 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
如果需要使用一组参数启动命令,例如
ls -al /bin
努力做到那样
docker run --entrypoint ls -it debian /bin -al
其中 ls
在 --entrypoint
之后,所有参数都放在图像名称之后
我有一个 docker 图片 运行 一个 wordpress 安装。该图像通过执行 apache 服务器作为默认命令。因此,当您停止 apache 服务时,容器将退出。
问题出现在弄乱 apache 服务器配置之后。容器无法启动,无法恢复镜像内容
我的选择是覆盖容器运行的命令或将上次文件系统更改恢复到以前的状态。
这些事情有可能吗?备选方案?
当您使用 docker run
启动容器时,您可以在容器内向 运行 提供命令。这将覆盖图像中指定的任何命令。例如:
docker run -it some/container bash
如果您修改了容器内的配置,不会影响图像的内容。因此,您可以 "revert the filesystem changes" 只需从原始图像启动一个新容器...在这种情况下,您仍然可以使用 原始 图像。
如果您使用 docker commit
命令生成一个 new 包含您在容器。
有多种方法可以覆盖 docker 图像的默认命令。这里有两个:
- 如果您有一个带有默认 CMD 命令的图像,您可以简单地在
docker run
中覆盖它,将您希望 运行 (Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
) 使用
BASE
图像创建一个包装图像,您要覆盖CMD
或ENTRYPOINT
。例子FROM my_image CMD ["my-new-cmd"]
此外,您可以尝试以不同的方式还原更改:
- 如果您有要还原的映像的 Dockerfile,只需将更改重写到 Dockerfile 中,然后 运行 再次
docker build
处理。 - 如果您没有 Dockerfile 并且构建了提交更改的映像,则可以使用
docker history <IMAGE_NAME>:tag
,找到您想要的提交的 IMAGE_ID,然后 运行使用您希望的名称(和标签)提交的提交或标签(如果您要覆盖标签名称,请使用-f
选项)。示例:
$ docker history docker_io_package:latest
$ docker tag -f c7b38f258a80 docker_io_package:latest
如果您只想将内容复制出来,您可以使用下面的命令和更具体的路径。
sudo docker cp containername:/var/ /varbackup/
https://docs.docker.com/reference/commandline/cli/#cp
也可以从主机访问文件系统。 运行 下面的命令和底部的卷部分中它应该有一个存储文件系统修改的路径。
这不是一个好的永久解决方案。
docker inspect containername
如果您稍后重新创建容器,您应该考虑将数据保存在容器之外,并在创建容器时link将其作为虚拟路径放入容器中。如果您 link 通过这种方式将您的 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
如果需要使用一组参数启动命令,例如
ls -al /bin
努力做到那样
docker run --entrypoint ls -it debian /bin -al
其中 ls
在 --entrypoint
之后,所有参数都放在图像名称之后