Docker run 容器处于created状态问题

在最近遇到的一次问题中,有这样一种现象:

  系统有一个测试脚本会不断的执行docker run命令来运行容器,在测试过程中发现有一个情况是,有时候容器没有完全被运行到"Up"状态,而是处于"created"状  态,现象十分奇怪。

  上环境首先查看了"created"状态的容器,以及dockerd日志:

    (1) dockerd的日志中只有"post create"请求,但是居然没有收到该容器的"post start"请求;

    (2) 手动执行docker start是可以将此容器拉起到"Up"状态,说明容器、镜像本身没有问题。

综合上面现象,怀疑是"docker run"流程没有执行完毕,docker run就退出了导致。立刻翻阅"docker run"在cli/command/container/run.go中对于"docker run"命令的处理函数func runRun()的实现中有如下情况:

func runRun(dockerCli *command.DockerCli, flags *pflag.FlagSet, opts *runOptions, copts *runconfigopts.ContainerOptions) error {
    。。。。。。
    createResponse, err := createContainer(ctx, dockerCli, config, hostConfig, networkingConfig, hostConfig.ContainerIDFile, opts.name)
    。。。。。。
    if err := client.ContainerStart(ctx, createResponse.ID, types.ContainerStartOptions{}); err != nil {)
    。。。。。
}

  如果在执行完createContainer()函数后"docker run"命令异常退出(如遇到kill信号),此时ContainerStart()函数无法继续运行。这就会导致容器虽然创建成功处于"created"状态,但是并没有真正的给dockerd"post start",最终造成上述现象。

  因而在日常生产过程中有必要对"docker run"命令进行监控,比如判断它是否执行成功,是否异常退出,退出时返回值是否为0等等。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用for循环可以批量创建Docker容器。首先,我们需要安装Docker引擎,并确保Docker命令行可用。 下面是使用for循环批量创建Docker容器的步骤: 1. 首先,我们需要定义要创建容器数量,可以使用变量来保存该值,例如:`count = 5`。 2. 在for循环中,我们可以使用`range()`函数来迭代所需的次数。例如,`for i in range(count):`。 3. 在循环内部,我们可以使用Docker命令来创建容器。例如,`docker run -d -p 8080:80 --name container_name[i] image_name`。其中`container_name[i]`可以使用字符串和循环变量来动态生成不同的容器名称,`image_name`是要使用的Docker镜像名称。 4. 可以在每次循环结束后打印出容器名称,以确认容器是否成功创建。例如,`print("Container", container_name[i], "created")`。 完成以上步骤后,使用for循环即可批量创建Docker容器。 以下是一个示例代码: ```python count = 5 container_name = ["container1", "container2", "container3", "container4", "container5"] image_name = "docker_image" for i in range(count): command = f"docker run -d -p 8080:80 --name {container_name[i]} {image_name}" os.system(command) print("Container", container_name[i], "created") ``` 以上代码将会以`docker_image`镜像为模板创建5个名称分别为`container1`到`container5`的容器,并将容器的80端口映射到主机的8080端口。在每次循环结束后,代码将会打印出相应的容器名称,以便确认容器是否成功创建。 当然,在实际使用时,我们需要根据实际情况调整代码以满足特定的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值