【问题标题】:Is it possible to reuse an existing stopped container when docker-compose run command is fired?触发 docker-compose run 命令时是否可以重用现有的已停止容器?
【发布时间】:2020-06-04 17:45:02
【问题描述】:

我从 Visual Studio 2019 创建了以下简单的 dotnet 核心控制台应用程序。

Console.WriteLine("Hello World!"); 
var readText = Console.ReadLine(); 
Console.WriteLine(readText);

然后我将 docker 支持添加到这个控制台项目。我已经在另一个 so question 中编写了分步说明以添加 docker 支持。

在命令提示符下,我现在导航到 docker-compose 文件所在的文件夹并发出以下命令

docker-compose run <service name from docker-compose.yml file>

特别是我的情况

docker-compose run dokconsoleapp

其中 dokconsoleapp 是在 docker-compose 文件中定义的服务名称。

这会构建映像,我的控制台应用程序将启动并在容器内交互运行。

当应用退出时,容器会停止。现在,当我想再次运行时,我再次发出相同的命令。该应用程序按预期运行。但奇怪的是,该应用程序是在一个新容器中启动的,而不是重用现有的停止容器。

所以我运行该命令 3 次,每次创建新容器时,请在 docker 桌面中查看。

现在我的问题是,我只是好奇,这里有没有办法使用 docker-compose run 来重用现有容器,而不是创建新容器。

注意命令

docker-compose up 

不起作用,因为它创建的容器不是交互式的。所以我只能使用“运行”。更多详情here.

【问题讨论】:

  • "当应用退出时,容器停止。"这通常是 Docker 的工作方式。为什么这对您的应用程序来说是个问题?您能否在问题中包含一些与 Docker 相关的工件(例如,您的 docker-compose.yml 文件中是否有 volumes:)?

标签: docker docker-compose


【解决方案1】:

使用docker-compose run $SERVICENAME 将始终创建一个新容器,如文档中所述。

参考:-https://docs.docker.com/compose/reference/run/

您在新容器中运行启动时使用的命令具有由服务定义的配置,包括卷、链接和其他详细信息。但是,有两个重要的区别。

我查看了您的其他帖子,因为您正在尝试获得具有特定服务的交互式外壳,您可以通过以下方式实现。看看例子docker-compose.yml

version: '3'
services:
  test:
    container_name: test
    image: 'busybox'
    command: sleep 5d

运行docker-compose up -d

-d => 以分离模式运行

command: sleep 5d 根据 5 days 运行的容器,然后在此之后 然后使用以下命令执行到容器中

$ docker exec -it test /bin/sh 

然后你不会每次都得到新的容器。

也可以看看这篇文章:- https://docs.docker.com/compose/compose-file/#domainname-hostname-ipc-mac_address-privileged-read_only-shm_size-stdin_open-tty-user-working_dir

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 2016-02-21
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多