作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
有谁知道如何将 nodejs 静态编译为单个可执行二进制文件?我的意思是不需要共享库。
有一些旧版本nodejs的指南,但不适用于最后一个。
谢谢!
最佳答案
正如 Daniel Milde 所指出的,https://hub.docker.com/r/dundee/nodejs-static/是一种替代方案,但它已被弃用,并且没有暴露 Dockerfile,因此不会激发信任。
我已经从头开始在容器中测试了 Node 二进制文件并且它工作正常。
您可以自己构建静态链接的 Node 。
~/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$
让我们从头开始使用 docker 容器进行测试:
~/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
$ docker run -ti node-static:latest /node
Welcome to Node.js v14.0.0-pre.
Type ".help" for more information.
> var x = { 'test': 123 };
undefined
> x.test
123
>
您也可以在 Dockerfile 中构建它:
Dockerfile.node
文件:
FROM alpine:3.11.3
RUN apk add git python gcc g++ linux-headers make
RUN git clone https://github.com/nodejs/node && \
cd node && \
./configure --fully-static --enable-static && \
make
FROM scratch
COPY --from=0 out/Release/node /node
CMD /node
然后构建:
$ docker build -f Dockerfile.node -t node-static .
Sending build context to Docker daemon 121.9kB
Step 1/6 : FROM alpine:3.11.3
---> e7d92cdc71fe
Step 2/6 : RUN apk add git python gcc g++ linux-headers make
---> Using cache
---> c343d63a3094
Step 3/6 : RUN git clone https://github.com/nodejs/node && cd node && ./configure --fully-static --enable-static && make
---> Using cache
---> e7f9fc931827
Step 4/6 : FROM scratch
--->
Step 5/6 : COPY --from=0 /node/out/Release/node /node
---> 045ad784eadc
Step 6/6 : CMD /node
---> Running in f48178348e7b
Removing intermediate container f48178348e7b
---> ff1d93da95c8
Successfully built ff1d93da95c8
Successfully tagged node-static:latest
或者,如果你信任我,你可以使用我的公共(public) docker 镜像 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
关于node.js - 如何将 nodejs 编译为单个完全静态的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17943595/
我是一名优秀的程序员,十分优秀!