[当我尝试通过#!/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"]
)时,它可以正常工作。
将-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中的ENTRYPOINT
与docker run
命令结合在一起,您将获得一个结合的命令bash /hello-world.js
。
如果确实需要交互式shell来调试容器,则可以使用以下方法启动它:
docker run --rm -it foobar/hello-world /bin/sh