【云计算 | Docker】Docker容器后台运行不了?entrypoint在作妖?

这篇具有很好参考价值的文章主要介绍了【云计算 | Docker】Docker容器后台运行不了?entrypoint在作妖?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 问题

使用镜像alpine起个容器,使其保持后台运行,正常情况有如下的效果,可以发现容器保持运行状态。

[root@k8s-master helloWorld]# docker run -dit  docker.io/alpine /bin/sh
8d39d7579d5e4f1a560aef16ba57ab5cae2506ea9105e21cbc06342a4d4fe17f
[root@k8s-master helloWorld]# docker ps
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS              PORTS               NAMES
8d39d7579d5e        docker.io/alpine          "/bin/sh"           6 seconds ago       Up 5 seconds                            loving_shannon

但是有时候一些容器镜像按照上述方法却达不到预期效果。比如下面这个容器,一创建完就退出了。

[root@k8s-master helloWorld]# docker run -dit helloapp:v1 /bin/sh
8b654e4dc44c9a30544099bf360a4d410cfa81ad9bc14e73c0f384a166bf2420
[root@k8s-master helloWorld]# docker ps --all |grep 8b65
8b654e4dc44c        helloapp:v1                                           "./hello /bin/sh"        14 seconds ago      Exited (0) 13 seconds ago                                        fervent_hoover

那么问题出在哪个环节呢?

2. 分析

首先明确一个Docker容器的特性,docker容器运行必须有一个进程, 如果没有进程执行,容器认为空闲,就会自行退出
那么我们使用docker inspect <id>看看上述两个容器启动时分别执行了什么命令

  • 成功后台运行的容器
[root@k8s-master helloWorld]# docker inspect 938 |  head
[
    {
        "Id": "938cf5ba3fe61e30265e6b44b5493d6d9e60909f77dd4c72da6ee3395e593e55",
        "Created": "2023-07-31T14:41:02.155416227Z",
        "Path": "/bin/sh",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
[root@k8s-master helloWorld]#

可以看到Path值对应的/bin/sh就是容器创建时执行的命令

  • 退出的容器
[root@k8s-master helloWorld]# docker inspect 8b654e4dc44c | head
[
    {
        "Id": "8b654e4dc44c9a30544099bf360a4d410cfa81ad9bc14e73c0f384a166bf2420",
        "Created": "2023-07-31T16:49:46.95505723Z",
        "Path": "./hello",
        "Args": [
            "/bin/sh"
        ],
        "State": {
            "Status": "exited",
[root@k8s-master helloWorld]#

可以看到Path对应的值是./helloArgs对应的值就是./hello的参数

现在问题基本明朗,就是docker run指定的/bin/sh并不是容器创建时真正执行的命令,而是作为了Path值的参数。当Path值对应的命令执行结束后,容器也就退出了

根本原因:
如果容器镜像制作时,DockerFile中通过ENTRYPOINT指定了容器运行时执行的命令,那么docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 中的COMMAND不生效,直接作为ARG

如果IMAGE后带多个参数,效果也是一样,全部作为了ARG

[root@k8s-master helloWorld]# docker run -dit helloapp:v1  /bin/sh first second
dc0f72e6a8c20915aa31fb325c25e32a0c7230e5596e8747cac3e5c147d47e49

[root@k8s-master helloWorld]# docker inspect dc | head -12
[
    {
        "Id": "dc0f72e6a8c20915aa31fb325c25e32a0c7230e5596e8747cac3e5c147d47e49",
        "Created": "2023-07-31T17:37:09.251912669Z",
        "Path": "./hello",
        "Args": [
            "/bin/sh",
            "first",
            "second"
        ],
        "State": {
            "Status": "exited",

3. 解决方法

通过--entrypoint参数指定容器创建时执行的命令,覆盖DockerFile中指定的ENTRYPOINT
例如:

[root@k8s-master helloWorld]# docker run -dit --entrypoint /bin/sh helloapp:v1
f00a30b58cf15246ecec2e9089a96a1ebfe57110313f3e45e7b1cd6b12d04536
[root@k8s-master helloWorld]#
[root@k8s-master helloWorld]# docker inspect f0 | head
[
    {
        "Id": "f00a30b58cf15246ecec2e9089a96a1ebfe57110313f3e45e7b1cd6b12d04536",
        "Created": "2023-07-31T17:42:52.001675371Z",
        "Path": "/bin/sh",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
[root@k8s-master helloWorld]#

补充:
如果通过指定--entrypoint还是不行,建议docker logs <id>检查下报错。如下面这个,就属于一些常见错误(指定的ARG不是–entrypoint对应的命令能执行的)文章来源地址https://www.toymoban.com/news/detail-628659.html

[root@k8s-master helloWorld]# docker run -dit --entrypoint /bin/sh helloapp:v1 today
edf83a787563a541cf53a0c0cf569307cc9f7f22e440ca0fb49980d23f181d11
[root@k8s-master helloWorld]#
[root@k8s-master helloWorld]# docker inspect edf | head -12
[
    {
        "Id": "edf83a787563a541cf53a0c0cf569307cc9f7f22e440ca0fb49980d23f181d11",
        "Created": "2023-07-31T17:47:21.330346122Z",
        "Path": "/bin/sh",
        "Args": [
            "today"
        ],
        "State": {
            "Status": "exited",
            "Running": false,
            "Paused": false,
[root@k8s-master helloWorld]# docker logs edf
/bin/sh: can't open 'today': No such file or directory
[root@k8s-master helloWorld]#

到了这里,关于【云计算 | Docker】Docker容器后台运行不了?entrypoint在作妖?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【快速解决】阿里云ECS使用Docker环境运行软件但公网访问不了

    根据阿里云官网教程基于ECS快速搭建Docker环境进行学习的过程中,发现使用阿里云ECS启动docker内的nginx后,访问公网ip发现访问不到。 教程给的代码是 但阿里云安全组默认是不开放8080端口的 所以根据教程搞不通 只要在安全组里添加一下就可以了,各种参数如下图第一个所示

    2024年02月14日
    浏览(39)
  • docker-java 用Java操作docker创建容器并运行运行容器

    参考上一篇文章:Docker设置开启远程访问 Apache HttpClient 5介绍: This transport is based on Apache HttpClient library version 5, which has a great flexibility and allows us to implement all Docker-specific features and protocols required, without having to use internal APIs or anything. It has everything to become the default transport of

    2023年04月09日
    浏览(83)
  • 在Docker守护进程停机期间保持容器运行(即重启Docker时,正在运行的容器不会停止)

      在默认情况下,当 Docker 守护进程终止时,它将关闭正在运行的容器。不过,我们可以配置该守护进程,以便在该守护进程不可用时容器仍在运行。这种功能称为实时恢复。实时还原选项有助于减少由于守护进程崩溃、计划中断或升级而导致的容器停机时间。 Docker官方相关

    2024年02月03日
    浏览(54)
  • 【Docker 】Docker 客户端,容器使用,启动容器,启动已停止运行的容器,停止一个容器,进入容器

    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。 可以通过命令 dock

    2024年02月11日
    浏览(46)
  • docker 容器如何查看正在运行容器的端口映射

    1、查看docker容器的版本 2、查看正在运行的容器 3、查看容器的端口映射 总结:到此就完成了查看正在运行容器的端口映射.

    2024年02月12日
    浏览(46)
  • docker中运行PostgreSQL容器

    我们如何在docker中运行postgresql容器,要进过如下几个步骤就可以了。 拉取postgresql容器 使用上述命令将从 Docker Hub 存储库中提取最新可用版本的 PostgreSQL。 从 PostgreSQL 服务器 Docker 镜像运行容器 在部署之前,您需要设置一个 Docker 卷或绑定安装来持久化您的数据库。否则,当

    2024年02月13日
    浏览(43)
  • docker运行redis容器失败

    原创文章,转载请标注并附上链接 http://t.csdn.cn/s4dmD 机器环境是vmware+ubuntu20.04,docker配置redis,出现容器无法启动,即启动失败 用docker logs redis(容器名或id)查看日志 发现是无法打开配置文件的问题 正确启动redis的命令 其中要注意的地方 1、是让docker有权限去读取配置文件 2、

    2024年02月16日
    浏览(44)
  • docker查看运行的容器日志

      1. 查看运行着的容器     2. 查看容器日志命令     3. 查看最近10条日志, 并持续打印   4. 查看某个日期至今的所有日志, 并持续打印

    2024年02月11日
    浏览(58)
  • Docker学习路线9:运行容器

    要启动一个新的容器,我们使用 docker run 命令,后跟镜像名称。基本语法如下: 例如,要运行官方的 Nginx 镜像,我们可以使用: 这会启动一个新的容器,并将主机的端口 8080 映射到容器的端口 80。 要列出所有正在运行的容器,请使用 docker ps 命令。要查看所有容器(包括已

    2024年02月16日
    浏览(42)
  • 使用Docker容器运行Mysql

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 随着虚拟化技术和云计算的普及,容器技术的优点也逐步体现,软件部署和环境迁移的优势无可替代。 目前Docker已经成为容器技术中的主要代表,恰好涉及需要在liunux系统上部署Mysql数据库用于测试,由

    2024年02月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包