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

问题描述 投票:0回答:2

[当我尝试通过#!/usr/bin/env node的命令参数使用诸如docker run ...之类的shebang执行JavaScript文件时,似乎“忽略了” 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"]

hello-world.js

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

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

docker dockerfile shebang
2个回答
1
投票

-c添加到入口点,以便bash期待命令。如果没有-c,它将其参数解释为要执行的bash脚本的名称。

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

0
投票

[我建议仅将默认的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
© www.soinside.com 2019 - 2024. All rights reserved.