无法运行 docker 镜像
首先,如果我的问题听起来太简单或愚蠢,我很抱歉。我是 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 新手
有几件事您应该更正,首先是
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_PORT
或
machine_IP:$HOST_PORT
访问您的应用程序
请记住,docker args 顺序很重要:
你写的
docker run b24b37614e1a -it
与
docker run -it b24b37614e1a
不同>
希望它能解决你的问题 :)
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" ]