# 以下是 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"]
CMD ["sh", "-c", "cd /app/1 &&
nohup echo 1 & ;
cd /app/2 &&
java -jar a.jar"]
version-1: sh: syntax error: unexpected "&&"
version-2: sh: syntax error: unexpected ";"
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 ";"
1
scguanzhong 276 天前
这段命令中包含了一些可能导致执行失败的问题。具体如下:
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 。 请根据实际需要调整这个命令。 |
2
JinTianYi456 OP @scguanzhong #1 这是 gpt 吗? 大概知道问题所在了。大意是那句话,要执行一个"提供服务"的进程,它需要一直启动着,所以就加了 &,但想要它启动成功后才能执行后续的,所以 加了 &&。nohup 是之前学到的,比如 ssh 登录后,以后台方式执行了个进程,登出 ssh ,进程就被结束了,加上 nohup 避免这种情况
ps: 主题里的语句只是例子,不是真实要执行的 |
3
yumusb 276 天前
你可以在命令的最后加一个 sleep 9999d ,这样就能保证前台一直有进程了。
|
4
julyclyde 274 天前
你需要先学习基础知识再来用 docker
否则恐怕难以理解 docker 是以主进程的存活来看待整个容器的存活这个概念 |
5
GoodRui 273 天前
这个不仅在 docker 里不行,你直接在服务器系统里跑也跑不起来吧?你 nohup & 执行了一个命令,这条命令一直在执行有没有完成(成功),那怎么用&&再执行后面的命令?&&的意思是不是不了解?可以去查一下&&的用法。
|
6
JinTianYi456 OP @GoodRui #5 那我换成 ; 也不行呀~
|
7
rebecca554owen 246 天前
Dockerfile 不写 CMD ,用 sh 脚本,慢慢改你就方便 了。
|