Docker产生不正确的ENTRYPOINT命令

时间:2020-03-01 13:53:26

标签: docker dockerfile

我正在尝试为我的应用程序构建docker映像,但是由于ENTRYPOINT执行失败,因此无法基于该映像运行容器:

User.Name@pc-name MINGW64 ~
$ docker run some-repository.com/application-name:latest
/bin/sh: line 0: [: missing `]'

有我的Dockerfile:

FROM some-repository.com/openjdk:11.0.5-jre-slim as build
FROM some-repository.com/rhel7-atomic

COPY --from=build /usr/local/openjdk-11 jx/

LABEL Team="some-team"
LABEL AppVersion=1111

RUN mkdir -p id
COPY application-name-1.6.17-SNAPSHOT.jar id

EXPOSE 26000

ENTRYPOINT [ "sh", "-c", "exec echo hello \$JAVA_OPTS \
    world"]

docker inspect的结果:

"Cmd": [
    "/bin/sh",
    "-c",
    "#(nop) ",
    "ENTRYPOINT [\"/bin/sh\" \"-c\" \"[ \\\"sh\\\", \\\"-c\\\", \\\"exec echo hello \\\\$JAVA_OPTS     world\\\"]\"]"
],
"ArgsEscaped": true,
"Entrypoint": [
    "/bin/sh",
    "-c",
    "[ \"sh\", \"-c\", \"exec echo hello \\$JAVA_OPTS     world\"]"
]

好像ENTRYPOINT命令被错误地插值,并且在命令中添加了[字符。

为什么会出现此问题,我该如何解决?

1 个答案:

答案 0 :(得分:2)

删除$前面的转义符,这是json中的无效转义符,当字符串不解析为json时,它将解析为传递给shell的字符串。

ENTRYPOINT [ "sh", "-c", "exec echo hello $JAVA_OPTS \
    world"]

如果您想让echo回显以打印$,而不是让sh扩展变量,那么您需要两次转义来转义转义字符,以便json将传递单个{ {1}}到正在运行的命令:

\
相关问题