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 中的 ENTRYPOINT
与 docker run
命令组合在一起,您将获得一个组合命令 bash /hello-world.js
.
如果您确实需要交互式 shell 来调试容器,您可以使用
启动它
docker run --rm -it foobar/hello-world /bin/sh
当我尝试通过 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 中的 ENTRYPOINT
与 docker run
命令组合在一起,您将获得一个组合命令 bash /hello-world.js
.
如果您确实需要交互式 shell 来调试容器,您可以使用
启动它docker run --rm -it foobar/hello-world /bin/sh