我有一个脚本 startScript.sh
我想在 docker 容器完全启动后运行(包括加载容器应该启动的所有服务)
之后我想运行一个脚本:startScript.sh
这是我的做法:
sudo docker run -p 8080:8080 <docker image name> " /bin/bash -c ./startScript.sh"
但是这给了我一个错误:
WFLYSRV0073: Invalid option '/bin/bash'
即使尝试了不同的 shell 仍然是同样的错误。甚至尝试只传递脚本文件名。仍然没有帮助。
注意:我知道上面的文件是在根文件夹下的容器中:/
事实上,我曾经通过执行以下操作进入容器:sudo docker exec
并手动运行该脚本文件并且它起作用了。
但是当我尝试像上面那样自动执行它时,它对我不起作用。
一些问题: 1.请提出可能是什么问题。 2. 我想在容器完全启动并启动并运行后运行该脚本——包括其中的所有服务。这是正确的方法吗?还是在容器启动时尝试运行?
最佳答案
当您在图像名称后传递参数时,您不是在修改入口点,而是在修改命令 (CMD)。看来您的图片有 WFLYSRV0073
作为入口点,这使得实际执行的二进制文件成为您的入口点,您的命令作为参数。这使得 WFLYSRV0073
尝试解析 /bin/bash
时失败作为论点。
要仅运行您的脚本,您可以使用空字符串覆盖图像的入口点,使其运行您的命令的第一个元素。请注意,我还删除了引号,否则 Docker 将搜索名称包含空格的二进制文件,这当然不存在。
sudo docker run --entrypoint "" -p 8080:8080 <docker image name> /bin/bash -c ./startScript.sh
但这可能不是您想要的:它不会运行图像实际应该运行的内容,只会运行您的安装脚本。此处正确的做法是修改图像的 Dockerfile 以运行设置脚本作为入口点,并在它结束时运行脚本的当前入口点(您要运行的实际内容)。
或者,如果您不控制正在运行的图像,您可以使用 FROM <the current image>
在一个新的 Dockerfile 中构建另一个基于它的图像,将入口点设置为您的脚本。
编辑:
可以在 MariaDB's entrypoint 中看到有关如何完成上述操作的示例。 :您首先启动一个临时服务器,运行您的设置,然后重新启动它,最后运行最终服务(即 CMD)。
上面的解决方案在你想为图像执行初始化的情况下很好,但是如果你只是想能够出于开发原因运行脚本而不是在图像的入口点上一致地执行它,你可以将它复制到你的容器,然后使用 docker exec <container name> your-command and-arguments
运行它。
关于docker 入口点脚本无法运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62480713/