V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JinTianYi456
V2EX  ›  Docker

Dockerfile 里哪个字符影响了启动?

  •  
  •   JinTianYi456 · 301 天前 · 1211 次点击
    这是一个创建于 301 天前的主题,其中的信息可能已经有所发展或是发生改变。
    # 以下是 ok 的
    CMD ["sh", "-c", "cd /app && \
    echo 1 && \
    cd /app && \
    java -jar a.jar"]
    
    # 哪里语法错了?
    CMD ["sh", "-c", "cd /app && \
    nohup echo 1 & && \
    cd /app && \
    java -jar a.jar"]
    
    第 1 条附言  ·  301 天前

    version-2 哪里语法错了?

    CMD ["sh", "-c", "cd /app/1 &&
    nohup echo 1 & ;
    cd /app/2 &&
    java -jar a.jar"]

    第 2 条附言  ·  301 天前

    version-1: sh: syntax error: unexpected "&&" version-2: sh: syntax error: unexpected ";"

    第 3 条附言  ·  301 天前
    version-1: sh: syntax error: unexpected "&&"
    
    
    # version-2 哪里语法错了?
    CMD ["sh", "-c", "cd /app && \
    nohup echo 1 & ; \
    cd /app && \
    java -jar a.jar"]
    
    version-2: sh: syntax error: unexpected ";"
    
    7 条回复    2024-03-27 12:19:08 +08:00
    scguanzhong
        1
    scguanzhong  
       301 天前
    这段命令中包含了一些可能导致执行失败的问题。具体如下:

    nohup echo 1 & && 这一部分有语法错误。&& 用于连接两个命令,但在 & && 的用法中,& 已经将 nohup echo 1 放入后台执行,这时再使用 && 就没有前一个命令的执行结果来决定是否执行后一个命令,因此这里的 && 是多余且错误的。

    nohup echo 1 & 这个命令在后台执行 echo 1 并试图使用 nohup 来忽略挂断信号。但是 echo 命令执行非常快,使用 nohup 对它来说没有太大的意义,除非你有特殊的用途,比如输出到一个文件中。

    在多条命令中使用 cd /app 是没有必要的,因为当你第一次执行 cd /app 后,后续的命令都会在 /app 目录下执行,除非中间有改变目录的命令。

    修正后的命令可能看起来像这样:

    sh
    Copy code
    CMD ["sh", "-c", "cd /app && \
    nohup echo 1 > output.txt & \
    java -jar a.jar"]
    这里做了以下修改:

    移除了错误的 &&。
    将 echo 1 的输出重定向到一个文件(例如 output.txt ),这样使用 nohup 会更有意义。
    移除了重复的 cd /app 。
    请根据实际需要调整这个命令。
    JinTianYi456
        2
    JinTianYi456  
    OP
       301 天前
    @scguanzhong #1 这是 gpt 吗? 大概知道问题所在了。大意是那句话,要执行一个"提供服务"的进程,它需要一直启动着,所以就加了 &,但想要它启动成功后才能执行后续的,所以 加了 &&。nohup 是之前学到的,比如 ssh 登录后,以后台方式执行了个进程,登出 ssh ,进程就被结束了,加上 nohup 避免这种情况

    ps: 主题里的语句只是例子,不是真实要执行的
    yumusb
        3
    yumusb  
       301 天前
    你可以在命令的最后加一个 sleep 9999d ,这样就能保证前台一直有进程了。
    julyclyde
        4
    julyclyde  
       299 天前
    你需要先学习基础知识再来用 docker
    否则恐怕难以理解 docker 是以主进程的存活来看待整个容器的存活这个概念
    GoodRui
        5
    GoodRui  
       299 天前
    这个不仅在 docker 里不行,你直接在服务器系统里跑也跑不起来吧?你 nohup & 执行了一个命令,这条命令一直在执行有没有完成(成功),那怎么用&&再执行后面的命令?&&的意思是不是不了解?可以去查一下&&的用法。
    JinTianYi456
        6
    JinTianYi456  
    OP
       298 天前
    @GoodRui #5 那我换成 ; 也不行呀~
    rebecca554owen
        7
    rebecca554owen  
       271 天前
    Dockerfile 不写 CMD ,用 sh 脚本,慢慢改你就方便 了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5855 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 02:38 · PVG 10:38 · LAX 18:38 · JFK 21:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.