JavaScript 中的 Shebang 在 Docker 中以“/bin/bash”作为入口点作为命令执行时被忽略

Shebang in JavaScript ignored when executed as command in Docker with "/bin/bash" as entrypoint

当我尝试通过 docker run ... 的命令参数执行带有诸如 #!/usr/bin/env node 的 shebang 的 JavaScript 文件时,它似乎 "ignore" shebang。

$ docker run --rm foobar/hello-world /hello-world.js
/hello-world.js: line 2: syntax error near unexpected token `'Hello, World!''
/hello-world.js: line 2: `console.log('Hello, World!');'

Dockerfile

FROM node:13.12-alpine
COPY hello-world.js /hello-world.js
RUN chmod +x /hello-world.js
RUN apk update && apk update && apk add bash
ENTRYPOINT ["/bin/bash"]

你好-world.js

#!/usr/bin/env node
console.log('Hello, World!');

当我直接使用 /hello-world.js 作为入口点时 (ENTRYPOINT ["/hello-world.js"]) 它工作正常。

-c 添加到入口点,这样 bash 将需要一个命令。如果没有 -c,它将其参数解释为要执行的 bash 脚本的名称。

ENTRYPOINT ["/bin/bash", "-c"]

我建议只将默认 CMD 设置为您在容器中安装的程序,如果您只需要其中之一,通常更喜欢 CMD 而不是 ENTRYPOINT .

FROM node:13.12-alpine
COPY hello-world.js /hello-world.js
RUN chmod +x /hello-world.js
CMD ["/hello-world.js"]

当您在 docker run 命令行中提供命令时,它会覆盖 Dockerfile CMD(如果有),并附加到 ENTRYPOINT。在您的原始示例中,Dockerfile 中的 ENTRYPOINTdocker run 命令组合在一起,您将获得一个组合命令 bash /hello-world.js.

如果您确实需要交互式 shell 来调试容器,您可以使用

启动它
docker run --rm -it foobar/hello-world /bin/sh