开发者问题收集

无法运行 docker 镜像

2020-05-27
5493

首先,如果我的问题听起来太简单或愚蠢,我很抱歉。我是 docker 新手。 我已经创建了我的 docker 镜像并传递了几个 jar 文件,这些文件将在容器启动时立即运行。 我想在容器启动时立即运行脚本“serve.sh” 我成功地创建了镜像,但是当我运行容器时,它会抛出这个错误:

C:\Program Files\Docker\Docker\resources\bin\docker.exe: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-it\": executable file not found in $PATH": unknown.

这是我用来运行我创建的镜像的命令:

docker run b24b37614e1a -it

这是我的 docker 文件:

FROM openjdk:8-jdk-alpine
EXPOSE 8080:8080
COPY apigateway-0.0.1-SNAPSHOT.jar apigateway.jar
COPY authservice-0.0.1-SNAPSHOT.jar authservice.jar
COPY institutionsservice-0.0.1-SNAPSHOT.jar institutionsservice.jar
COPY messagesservice-0.0.1-SNAPSHOT.jar messagesservice.jar
COPY postsservice-0.0.1-SNAPSHOT.jar postsservice.jar
COPY userservice-0.0.1-SNAPSHOT.jar userservice.jar
COPY serve.sh serve.sh
CMD [ "bash" "./serve.sh" ] 

请问我做错了什么?我是 docker 新手

3个回答

有几件事您应该更正,首先是 CMD 格式应该是

CMD instruction has three forms:

CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
CMD [ "/bin/bash" , "./serve.sh" ] 

还有一件事,当您执行 docker run 时,指令是

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

这意味着所有选项必须位于 IMAGE 之前,而在您的情况下 it 出现在 IMAGE 之后。

正确的命令应该是

docker run -it b24b37614e1a

顺便说一句 ,一个小问题,为什么您要运行这个应用程序的交互式容器。理想情况下,它应该是这样的

docker run -p $HOST_PORT:$APP_PORT b24b37614e1a

-p =>将容器的端口发布到主机

然后您可以通过 localhost:$HOST_PORTmachine_IP:$HOST_PORT 访问您的应用程序

nischay goyal
2020-05-27

请记住,docker args 顺序很重要:
你写的 docker run b24b37614e1a -it

docker run -it b24b37614e1a
不同>

希望它能解决你的问题 :)

Luca Fabbian
2020-05-27

tl;dr

  • docker run -it then args (c/o Luca Fabbian)
  • 您没有 bash 。请使用 sh 。 (c/o MC Emperor)
  • CMD 执行形式需要数组,因此请使用逗号 CMD ["sh", "./serve.sh"]
  • 如果您容易忘记语法,CMD 有一个 shell 形式: CMD ./serve.sh
  • 如果不需要,甚至不要执行 shell: CMD ["./serve.sh"]

参数顺序很重要

这假设您已经采纳了 Luca 的 建议

Keep in mind that docker args order matters: you wrote docker run b24b37614e1a -it which is different from docker run -it b24b37614e1a

您没有 bash

我拉了 openjdk:8-jdk-alpine 图像进行确认,并且它不附带 bash。Alpine 图像附带 sh ,因此除非您更正所使用的 shell 或安装 bash,否则提供的代码 永远 不会起作用。

“未知操作数”

来自您对 nischay 的回复:

I get this error: "sh: ./serve.sh: unknown operand"

I updated My CMD instruction to: CMD [ "bin/bash" "./serve.sh" ]

exec 形式的 CMD 接受一组指令。 这些必须用逗号分隔。

这样做:

CMD [ "executable", "param1" ]
                  ^

关于使用 CMD 的说明

正如 nischay 所说 ,有几种不同的方法可以使用 CMD 来做大致相同的事情, 来自引用的参考

事实上,你 可以 使用 CMD 的 exec 形式来表示如下内容:

CMD [ "sh", "./serve.sh" ] 

输入 /bin/sh/bin/bash 或任何你想要的 shell 是不需要的,除非需要。但是,如果您不需要 shell,也可以使用不带 shell 的 exec 形式:

CMD [ "./serve.sh" ]
dcwaters
2020-11-18