如何在没有Docker合成的情况下重新创建Docker容器

pw9qyyiw  于 2022-12-22  发布在  Docker
关注(0)|答案(3)|浏览(150)

TLDR:当使用docker compose 时,我可以通过在运行docker-compose up的沿着更改docker-compose.yml文件中的配置和/或映像来简单地 * 重新创建 * 一个容器。对于重新创建一个由docker create/run命令创建的容器(以应用更改),是否有任何通用的等效方法?
详细说明一下:
associated docker compose documentation声明:
如果服务已有容器,并且服务的配置或映像在容器创建后发生了更改,则docker-composite up会通过停止并重新创建容器(保留已装载的卷)来获取更改。
我很难理解在这个 recreation 过程中实际执行了哪些底层步骤,因为例如docker(没有编写)文档似乎根本没有真正使用 recreate 术语。
简单地运行docker container rm xy然后运行docker container create/run(沿着传递完整的和修改过的配置)安全吗?或者docker compose实际上在幕后做了更多的事情吗?
我已经找到了关于应用 * 特定 * 配置更改(例如this one about port mappings)的答案,但我仍然想知道是否有更通用的答案。

uyto3xhc

uyto3xhc1#

我很难理解在这个重新创建过程中实际执行了哪些底层步骤,例如,docker(没有编写)文档似乎根本没有真正使用recreate术语。
docker-compose是一个高级工具;它使用docker cli在单个操作中执行需要多个命令才能执行的操作。当docker-compose显示“docker-composite up pickup the changes by stopping and recreating the container”时,表示它执行的操作相当于:

docker stop <somecontainer>
docker rm <somecontainer>
docker run ...

(其中...表示docker-compose.yaml中的服务定义所隐含的任何配置)。

svmlkihl

svmlkihl2#

假设它识别出container1中的更改(实际上不是,通过API工作):

docker compose rm -fs container1
docker compose create (--build) container1
docker compose start container1

部分接近于什么(取决于您的合成配置):

docker rm -f projectname_container1
(docker build --flags)
docker create --allDozensOfAttributes projectname_container1
docker start  projectname_container1
docker network connect (--flags) projectname_networkname projectname_container1
and maybe more..

因此,如果合适的话,我建议对单个服务使用Docker编写命令,而不是Docker CLI。

rqmkfv5c

rqmkfv5c3#

问题是变量和设置没有通过任何docker apis公开,可以通过直接连接到docker套接字,解析变量,然后停止/删除容器并重新创建它。
这很容易导致各种错误,并且需要进行大量调试才能获得这些值。
我所做的只是将我的Docker命令存储在一个shell脚本中。你可以将需要运行的命令保存到一个文本文件中,命名为.sh,在文件上设置-x,然后运行它。然后,当你停止/删除容器时,你可以重新运行shell脚本。
你可以做的另一件事是用一个函数来替换docker命令(比如~/.bashrc),这个函数将参数存储到一个文本文件中,然后用一个传递的参数来重新检查这个文本文件(比如“recreate”后面跟一个名字)。

相关问题