DockerのPHP + Node.jsマルチビルドでsymbol not found

Dockerで、「nginx:1.13.5-alpine」 + 「php:7.3-fpm-alpine」 + 「mysql:5.7.19」のコンテナ構成で、 laraveを使うため、「node:12.13.0-alpine as node + php:7.3-fpm-alpine」として、Node.jsを入れる。

Dockerfileを以下のようにマルチステージビルドでdocker-composeをbuildしてupすると、エラー出力

Dockerfile

FROM node:12.13.0-alpine as node

FROM php:7.3-fpm-alpine

RUN docker-php-ext-install pdo_mysql mysqli mbstring

WORKDIR /var/www/html

COPY --from=node /usr/local/bin/node /usr/local/bin/
COPY --from=node /usr/local/lib/node_modules/ /usr/local/lib/node_modules/
RUN ln -s /usr/local/bin/node /usr/local/bin/nodejs \
    && ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \
    && ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npx

Nodeを実行すると No such file or directory | symbol not foundのエラーが大量に出る

$ sudo docker exec -it {containerId} sh
/var/www/html # php -v
PHP 7.3.15 (cli) (built: Feb 20 2020 23:51:19) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.15, Copyright (c) 1998-2018 Zend Technologies
/var/www/html # node --version
Error loading shared library libstdc++.so.6: No such file or directory (needed by /usr/local/bin/node)
Error loading shared library libgcc_s.so.1: No such file or directory (needed by /usr/local/bin/node)
Error relocating /usr/local/bin/node: _ZNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode: symbol not found
Error relocating /usr/local/bin/node: _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE9push_backEc: symbol not found
Error relocating /usr/local/bin/node: _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE6resizeEmc: symbol not found
// 省略

共有ライブラリを使っていてエラーになるらしい
Docker fileに以下の2行を追加する

RUN apk add --no-cache --virtual g++
RUN apk add --no-cache libstdc++ && apk add --no-cache libgcc

g++ はc++のコンパイラ
libstdc++は標準 C++ のライブラリ、c++をコンパイル時に使用
libgccはラインタイムライブラリ
Node.jsはc++なんですね。

Dockerfile

FROM node:12.13.0-alpine as node

FROM php:7.3-fpm-alpine

RUN docker-php-ext-install pdo_mysql mysqli mbstring
RUN apk add --no-cache --virtual g++
RUN apk add --no-cache libstdc++ && apk add --no-cache libgcc

WORKDIR /var/www/html

COPY --from=node /usr/local/bin/node /usr/local/bin/
COPY --from=node /usr/local/lib/node_modules/ /usr/local/lib/node_modules/
RUN ln -s /usr/local/bin/node /usr/local/bin/nodejs \
    && ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \
    && ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npx

$ sudo docker exec -it ${containerId} sh
/var/www/html # php -v
PHP 7.3.15 (cli) (built: Feb 20 2020 23:51:19) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.15, Copyright (c) 1998-2018 Zend Technologies
/var/www/html # node -v
v12.13.0
/var/www/html # npm -v
6.12.0

うーん、結構きついね。