无法运行Docker映像

时间:2020-05-27 22:19:20

标签: java spring-boot docker dockerfile alpine

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

C:\ Program Files \ Docker \ Docker \ resources \ bin \ docker.exe:来自守护程序的错误响应:OCI运行时创建失败:container_linux.go:349:启动容器进程导致“ exec:\”-it \” :在$ PATH中找不到可执行文件”:未知。

这是我用来运行图像的命令:

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 个答案:

答案 0 :(得分:3)

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

不同
docker run -it b24b37614e1a

希望它可以解决您的问题:)

答案 1 :(得分: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

BTW ,小问题,为什么要运行此应用程序的交互式容器。理想情况下,应该是类似

docker run -p $HOST_PORT:$APP_PORT b24b37614e1a

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

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

答案 2 :(得分:0)

tl; dr

  • docker run -it 然后 args(c / o Luca Fabbian)
  • 您没有bash。使用sh。 (c / o MC Emperor)
  • CMD执行表单需要一个数组,因此请使用逗号CMD ["sh", "./serve.sh"]
  • 如果您容易忘记语法,CMD具有外壳形式:CMD ./serve.sh
  • 即使您不必执行CMD ["./serve.sh"]
  • ,甚至都无需执行外壳程序

参数顺序很重要

这假设您已经参加了Luca的advice

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

不同

您没有bash

我拉出openjdk:8-jdk-alpine图片进行确认,但它没有附带bash。 sh附带有高山图像,因此除非您更正所使用的外壳或安装bash,否则提供的代码将永远不会起作用

“未知操作数”

从您对尼舍的回应:

我收到此错误:“ sh:./serve.sh:未知操作数”

我将我的CMD指令更新为:CMD [“ bin / bash”“ ./serve.sh”]

exec格式的

CMD接受一系列指令。 这些必须用逗号分隔。

执行此操作:

CMD [ "executable", "param1" ]
                  ^

使用CMD的注意事项

引述said,就像from the reference一样,有几种不同的方式使用CMD来完成相同的事情。

可以实际上使用CMD的exec形式来表达以下内容:

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

除非需要,否则不需要键入/bin/sh/bin/bash或所需的任何shell。但是,如果您不需要外壳,也可以在不使用外壳的情况下使用exec表单:

CMD [ "./serve.sh" ]