Openproject bajo Docker en Rasperry Pi: problema con node + npm

Saludos:

Estoy intentando instalar Openproject bajo Docker en una Raspberry Pi. Pensaba que iba a ser una tarea fácil ya que Openproject proporciona una imagen de Docker lista para descargar y poner a funcionar; sin embargo no ha sido así.

Dando un vistazo a las fuentes de Openproject, en concreto al Dockerfile veo que instalan Node.js por binario, en concreto por un binario para x86 así que, me he felicitado por ser solución fácil.

He modificado el Dockerfile para instalar la versión para Armv7 de Node.js y he intentado reconstruir la imagen pero… agua:

Step 25/35 : RUN cd /tmp/npm/frontend/ && RAILS_ENV=production npm install --ignore-scripts
 ---> Running in b422318f10a1
/usr/bin/env: node: No such file or directory
The command '/bin/sh -c cd /tmp/npm/frontend/ && RAILS_ENV=production npm install --ignore-scripts' returned a non-zero code: 127

Buscando por la red había llegado a que faltaba un enlace desde /usr/local/bin/node a /usr/bin/node pero… no ha sido así.

No he conseguido encontrar nada más a lo que aferrarme y, por ello, os solicito ayuda.

Las modificaciones del Dockerfile:

$ git diff Dockerfile
diff --git a/Dockerfile b/Dockerfile
index d7b1cbb..3dd8f29 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -4,8 +4,8 @@ ENV NODE_VERSION="7.7.2"
 ENV BUNDLER_VERSION="1.11.2"
 
 # install node + npm
-RUN curl https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz | tar xzf - -C /usr/local --strip-components=1
-
+RUN curl https://nodejs.org/download/release/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-armv7l.tar.gz | tar xzf - -C /usr/local --strip-components=1
+#
 # Using /home/app since npm cache and other stuff will be put there when running npm install
 # We don't want to pollute any locally-mounted directory
 RUN useradd -d /home/app -m app
@@ -33,8 +33,10 @@ USER root
 COPY package.json /tmp/npm/package.json
 COPY frontend/*.json /tmp/npm/frontend/
 RUN chown -R app:app /tmp/npm
+RUN ln -s /usr/local/bin/node /usr/bin/node 
 
 USER app
+RUN echo "¿Esta node enlazado?" && ls -lh /usr/bin/n*
 RUN cd /tmp/npm/frontend/ && RAILS_ENV=production npm install --ignore-scripts
 RUN mv /tmp/npm/frontend /usr/src/app/
 
@@ -50,4 +52,4 @@ USER app
 RUN cd frontend && npm run postinstall
 RUN DATABASE_URL=sqlite3:///tmp/db.sqlite3 SECRET_TOKEN=foobar RAILS_ENV=production bundle exec rake assets:precompile
 
-CMD ["./docker/web"]
\ No newline at end of file
+CMD ["./docker/web"]

¡Ah! Por probar a ver si era problema de la imagen, la he recreado en mi máquina normal y la construye perfectamente, así que atribuyo el error a algo del Node.js para Arm. :^(

Gracias por adelantado.

Salud y Revolución.

Lobo.

Sigo investigando cosas sobre esto.

Parece que hay algo mal dentro del contenedor, si intento ejecutar node directamente observad:

app@547d7d2900f9:/usr/local/bin$ ./node 
bash: ./node: No such file or directory
app@547d7d2900f9:/usr/local/bin$ file node
node: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.26, BuildID[sha1]=e16f0f34ce6c99ec9a3a9be4a67db3a1033e84dc, not stripped
app@547d7d2900f9:/usr/local/bin$ type node
node is /usr/local/bin/node

He probado a descargar node en Raspbian directamente y se ejecuta sin problemas. He pensado: «algo ha modificado node dentro del contenedor», pero no:

$ md5sum node
480642cf225d0a21cf5fa44c892e88a6  node
app@547d7d2900f9:/usr/local/bin$ md5sum node
480642cf225d0a21cf5fa44c892e88a6  node

Como veis, las sumas de comprobación coinciden así que, ahora, si estoy bastante perdido, la verdad.

Estoy pensando… ¿podría ser algo del entorno virtual que establece env?

app@547d7d2900f9:/usr/local/bin$ env
NODE_VERSION=7.7.2
HOSTNAME=547d7d2900f9
GEM_HOME=/usr/local/bundle
TERM=xterm
OLDPWD=/usr/src/app
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
BUNDLE_SILENCE_ROOT_WARNING=1
BUNDLE_APP_CONFIG=/usr/local/bundle
PATH=/usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
RUBY_DOWNLOAD_SHA256=748a8980d30141bd1a4124e11745bb105b436fb1890826e0d2b9ea31af27f735
PWD=/usr/local/bin
RUBY_MAJOR=2.4
RUBYGEMS_VERSION=2.7.3
BUNDLE_BIN=/usr/local/bundle/bin
SHLVL=1
HOME=/home/app
BUNDLE_PATH=/usr/local/bundle
RUBY_VERSION=2.4.2
BUNDLER_VERSION=1.11.2
_=/usr/bin/env

Agradezco cualquier ayuda, gracias por vuestra atención.

Salud y Revolución.

Lobo.

Más curioso todavía:

$ cat Dockerfile 
FROM ruby:2.4

ENV NODE_VERSION="7.7.2"
ENV BUNDLER_VERSION="1.11.2"

# install node + npm
RUN curl https://nodejs.org/download/release/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-armv7l.tar.gz | tar xzf - -C /usr/local --strip-components=1
$ sudo docker build -t rgomeza/node-borrame .
$ sudo docker run -it rgomeza/node-borrame bash
root@4498198253fe:/# cd root/
root@4498198253fe:~# ls -lh
total 0
root@4498198253fe:~# mkdir node
root@4498198253fe:~# cd node/
root@4498198253fe:~/node# curl https://nodejs.org/download/release/v7.7.2/node-v7.7.2-linux-armv7l.tar.gz |tar zxf - --strip-components=1
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 13.8M  100 13.8M    0     0  1406k      0  0:00:10  0:00:10 --:--:-- 1582k
root@4498198253fe:~/node# ls -lh
total 152K
-rw-r--r-- 1 1000 1000  55K Mar  8  2017 CHANGELOG.md
-rw-r--r-- 1 1000 1000  58K Mar  8  2017 LICENSE
-rw-r--r-- 1 1000 1000  18K Mar  8  2017 README.md
drwxr-xr-x 2 1000 1000 4.0K Mar  8  2017 bin
drwxr-xr-x 3 1000 1000 4.0K Mar  8  2017 include
drwxr-xr-x 3 1000 1000 4.0K Mar  8  2017 lib
drwxr-xr-x 5 1000 1000 4.0K Mar  8  2017 share
root@4498198253fe:~/node# cd bin
root@4498198253fe:~/node/bin# ls -lh
total 31M
-rwxr-xr-x 1 1000 1000 31M Mar  8  2017 node
lrwxrwxrwx 1 1000 1000  38 Mar  8  2017 npm -> ../lib/node_modules/npm/bin/npm-cli.js
root@4498198253fe:~/node/bin# ./node
bash: ./node: No such file or directory

¿Porqué no funciona node dentro de un contenedor? :^m

Salud y Revolución.

Lobo.

Siguiendo con el entuerto, he encontrado al culpable pero no la razón del fallo.

Sabiendo que era node el culpable de todo he pensado en rehacer el contenedor oficial de node para partir desde ahí:

Y, amigos, resulta que la construcción de ese contenedor hace que node falle con el error del principio, «no such file».

Sin embargo, si hago docker pull node:8 resulta que funciona. Si, esas cosas con las que te quedas con cara de…

Tras intentar ver que podía pasar y como quiera que mi cometido principal era construir Openproject (y no Node) pues he tirado por la calle del medio y he construido a partir de la imagen de Node:8 que es la que funcionaba.

Así, sobre ella he construido el contenedor de Ruby del que depende Openproject y, sobre este, el contenedor de Openproject.

Evidentemente he comentado la parte donde descarga Node (y cruzado los dedos para que el cambio de versión de la 7.7.2 a la 8.9.3 no me afecte después).

Y, tras un chorro de tiempo de construcción… el contenedor ha sido creado.

Ahora bien, toda mi impresión es que este contenedor no esta muy bien creado, si no estoy equivocado seguro que se podría haber hecho que dependiera de los de Node y Ruby, además lo estoy ejecutando (te puedes esperar un rato, ¡ay Raspi!) y te descarga Phusion Passenger (ya miraré a ver que es eso) y… ¡Nginx! ¡Pero, bueno!

En fin, seguro que a @goretoxo si ha visto esto se le saltan los ojos. ;^)

Pues nada, cruzo los dedos y espero que todo termine de funcionar.

Gracias a todos.

Salud y Revolución.

Lobo.