Ausführen von ethereumjs/testrpc aus einem Docker-Container

Ich versuche, ein Setup zu erstellen, in dem ich einen Docker-Container habe, von dem aus ich ethereumjs/testrpc (eine Ethereum-Testumgebung) und einen anderen Docker-Container ausführe, auf dem eine Express-App ausgeführt wird. Ich wollte dann beides verbinden und, sagen wir, Kontostände in meiner Express-App anzeigen.

Mein Dockerfile ist

FROM node:boron

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install
# RUN npm install -g ethereumjs-testrpc --> tested adding this line
# did not work either

# Bundle app source
COPY . /usr/src/app

EXPOSE 3000

CMD [ "npm", "start" ]

und docker-compose sieht wie folgt aus

version: "2.0"
services:
  web:
    build: .
    volumes:
      - .:/usr/src/app
    ports:
      - "3000:3000"
    links: 
      - mongo
  mongo:
    image: mongo
    ports:
      - "27017:27017"
  ethereum:
    image: ethereumjs/testrpc:latest

Die Fehlerausgabe, die ich bekomme, sieht aus wie

web_1       | module.js:471
web_1       |     throw err;
web_1       |     ^
web_1       | 
web_1       | Error: Cannot find module 'ethereumjs-testrpc'
web_1       |     at Function.Module._resolveFilename (module.js:469:15)
web_1       |     at Function.Module._load (module.js:417:25)
web_1       |     at Module.require (module.js:497:17)
web_1       |     at require (internal/module.js:20:19)
web_1       |     at Object.<anonymous> (/usr/src/app/app.js:7:15)
web_1       |     at Module._compile (module.js:570:32)
web_1       |     at Object.Module._extensions..js (module.js:579:10)
web_1       |     at Module.load (module.js:487:32)
web_1       |     at tryModuleLoad (module.js:446:12)
web_1       |     at Function.Module._load (module.js:438:3)

app.jsSchließlich ist der Anfang meiner

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var TestRPC = require("ethereumjs-testrpc"); // these two lines are throwing
web3.setProvider(TestRPC.provider()); // the errors

Ich verstehe nicht, wie ich das beheben kann, und habe verschiedene Dinge ausprobiert, von denen keines zu funktionieren scheint. Jeder Hinweis in die richtige Richtung wäre sehr willkommen!

Antworten (1)

Hast du ethereumjs-testrpcim Abschnitt "Abhängigkeiten" deines package.json? z.B:

"dependencies": {
  "ethereumjs-testrpc": "^4.0.1"
}

Wenn nicht, könnte dies zu dem Fehler führen, den Sie erhalten.

Beim Ausführen npm install ethereumjs-testrpc --savewird dies automatisch zu Ihrer hinzugefügt package.json. Beachten Sie, dass dies ein einmaliger Befehl ist und nicht Teil der Dockerfile. Es aktualisiert einfach Ihre package.json mit der aktuellsten Version.

Auch, wenn Sie die -gvon entfernt haben

# RUN npm install -g ethereumjs-testrpc --> tested adding this line

... das würde wahrscheinlich auch funktionieren - aber wenn Sie es in Ihrem haben, package.jsonentfällt die Notwendigkeit, dies zu tun, da es im Befehl in der vorherigen Zeile installiert wird:

RUN npm install