Shebang в JavaScript игнорируется, когда выполняется как команда в Docker с "/ bin / bash" в качестве точки входа - PullRequest
0 голосов
/ 09 апреля 2020

Когда я пытаюсь выполнить файл JavaScript с шебангом, таким как #!/usr/bin/env node, через аргумент команды docker run ..., он, похоже, "игнорирует" шебанг.

$ 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"]) это работает правильно.

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

Добавьте -c к точке входа, поэтому bash будет ожидать команду. Без -c он интерпретирует свой аргумент как имя сценария bash для выполнения.

ENTRYPOINT ["/bin/bash", "-c"]
0 голосов
/ 10 апреля 2020

Я бы порекомендовал просто установить значение по умолчанию 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. В исходном примере ENTRYPOINT из Dockerfile объединяется с командой docker run, и вы получаете комбинированную команду bash /hello-world.js.

Если вам нужна интерактивная оболочка для отладки контейнера, вы может запустить это с

docker run --rm -it foobar/hello-world /bin/sh
...