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

306 天前
 JinTianYi456
# 以下是 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"]
1219 次点击
所在节点    Docker
7 条回复
scguanzhong
306 天前
这段命令中包含了一些可能导致执行失败的问题。具体如下:

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
306 天前
@scguanzhong #1 这是 gpt 吗? 大概知道问题所在了。大意是那句话,要执行一个"提供服务"的进程,它需要一直启动着,所以就加了 &,但想要它启动成功后才能执行后续的,所以 加了 &&。nohup 是之前学到的,比如 ssh 登录后,以后台方式执行了个进程,登出 ssh ,进程就被结束了,加上 nohup 避免这种情况

ps: 主题里的语句只是例子,不是真实要执行的
yumusb
306 天前
你可以在命令的最后加一个 sleep 9999d ,这样就能保证前台一直有进程了。
julyclyde
304 天前
你需要先学习基础知识再来用 docker
否则恐怕难以理解 docker 是以主进程的存活来看待整个容器的存活这个概念
GoodRui
303 天前
这个不仅在 docker 里不行,你直接在服务器系统里跑也跑不起来吧?你 nohup & 执行了一个命令,这条命令一直在执行有没有完成(成功),那怎么用&&再执行后面的命令?&&的意思是不是不了解?可以去查一下&&的用法。
JinTianYi456
303 天前
@GoodRui #5 那我换成 ; 也不行呀~
rebecca554owen
276 天前
Dockerfile 不写 CMD ,用 sh 脚本,慢慢改你就方便 了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1018553

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX