Как скомпилировать nodejs в один, полностью статический двоичный файл

Кто-нибудь знает, как статически компилировать nodejs в один исполняемый двоичный файл? Я имею в виду, что не нужны общие библиотеки.

Есть несколько руководств для старой версии nodejs, но не работает для последнего.

Спасибо!

Ответ 1

Вы можете использовать nodejs-static docker image, чтобы получить статически скомпилированный двоичный файл Node.JS, связанный с musl libc.

https://hub.docker.com/r/dundee/nodejs-static/

Ответ 2

Для тех, кто все еще считает эту тему актуальной, существует проект под названием node -packer, который компилирует javascript-код вместе с бинарным узлом nodejs, доступным здесь https://github.com/pmq20/node-packer, но для того, чтобы иметь по-настоящему статическую сборку, нужно изменить ruby ​​ script и добавить флаги --fully-static и -without-npm, которые должны активировать двоичный файл без libstdС++ или glibc, но есть некоторые оговорки, как объяснено на wiki nodejs. Я также сделал здесь модификацию (https://github.com/cmosh/node-packer), просто добавьте флаг -статический в команду, то есть nodec -static foo.js. Также для его запуска вам нужно будет установить как ruby, так и nodejs и запустить nodec script в папке bin клонированного репо.

Ответ 3

Собственно, я хочу, чтобы на платформе Android запускался один статический двоичный файл.

И теперь, до версии 0.11.8, node.js официально добавят поддержку android.

мой коллега строит его не только в руке, но и в android-x86. все работает отлично!

https://github.com/joyent/node/commit/5e4e8ec429381a8d1eebe31647e9daaaae42c54b

Ответ 4

Между тем есть http://enclosejs.com/, который, похоже, способен генерировать единый двоичный файл.

Ответ 5

Здесь еще один, который может упаковать ваше приложение в один исполняемый файл https://www.npmjs.com/package/pkg

Ответ 6

Как указал Дэниэл Милд, https://hub.docker.com/r/dundee/nodejs-static/ является альтернативой, но она устарела и не содержит Dockerfile, что не внушает доверия.

Я тестировал узел bynary в контейнере с нуля, и он работал.

Вы можете построить узел, статически связанный самостоятельно.

~/src$ git clone https://github.com/nodejs/node
cd node
~/src/node$ ./configure --help | grep static
  --fully-static        Generate an executable without external dynamic
  --partly-static       Generate an executable with libgcc and libstdc++
  --enable-static       build as static library
                        link to a shared http_parser DLL instead of static
    --shared-libuv      link to a shared libuv DLL instead of static linking
    --shared-nghttp2    link to a shared nghttp2 DLL instead of static linking
    --shared-openssl    link to a shared OpenSSl DLL instead of static linking
    --shared-zlib       link to a shared zlib DLL instead of static linking
    --shared-cares      link to a shared cares DLL instead of static linking
~/src/node$ ./configure --fully-static --enable-static
~/src/node$ make

...

~/src/node$ file out/Release/node 
out/Release/node: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=e5be29b02e283d0efdfc313e409b1a0802bd0603, with debug_info, not stripped
~/src/node$ /lib64/ld-linux-x86-64.so.2 --list out/Release/node 
        statically linked
~/src/node$ 

И пусть тестируют с докером контейнера с нуля

~/src/node$ cat > /tmp/Dockerfile.node-static <<EOF
FROM scratch
COPY out/Release/node /node
CMD /node
EOF
~/src/node$ docker build -t glaudiston/node-scratch -f /tmp/Dockerfile.node-static .
Sending build context to Docker daemon  1.239GB
Step 1/3 : FROM scratch
 ---> 
Step 2/3 : COPY out/Release/node /node
 ---> ec9d62bb7eb0
Step 3/3 : CMD /node
 ---> Running in 2e375fc580f7
Removing intermediate container 2e375fc580f7
 ---> 5d6a2b5f20b8
Successfully built 5d6a2b5f20b8
Successfully tagged glaudiston/node-scratch:latest
~/src/node$ docker run -ti glaudiston/node-scratch /node
Welcome to Node.js v12.0.0-pre.
Type ".help" for more information.
> var x = { 'test': 123 };
undefined
> x.test
123
> 

Вы также можете создать его в Dockerfile, может быть, я сделаю это.

на данный момент, вы можете использовать мой публичный докер изображения glaudiston/node-scratch

~/src/node$ docker push glaudiston/node-scratch
The push refers to repository [docker.io/glaudiston/node-scratch]
9251f7e82698: Pushed 
latest: digest: sha256:c6f2154daa0144abafc0a7070c48f0c4031a036901c75d432b8c826ae793a1d7 size: 529