Отправка запроса метода GET на сервер узла, работающий в Docker - PullRequest
0 голосов
/ 20 мая 2018

В настоящее время я использую сервер узлов с помощью Docker, который будет взаимодействовать с уже загруженным смарт-контрактом.Вот мой файл Docker:

FROM node:7
WORKDIR /app
COPY package.json /app
RUN npm install
RUN npm install -g npm
RUN ls
COPY . /app
CMD node gameserver.js
EXPOSE 8081
ARG walletPrivate
ENV walletPrivate = $private
ARG walletPublic
ENV walletPublic = $public

Я определяю переменные, которые я передам во время выполнения.Вот код сервера:

const express = require('express');
const Web3 = require('web3');
const Tx = require('ethereumjs-tx');
const MissionTrackerJson = require('./contracts/MissionTracker.json');

const app = express();
const port = process.env.PORT || 5001;
const providerUrl = 'https://rinkeby.infura.io/N9Txfkh1TNZhoeKXV6Xm';

const gamePublicKey = process.env.public;
const gamePrivateKey = process.env.private;
const production = true;

let contractAddress = null;
let contract = null;

let web3 = new Web3(new Web3.providers.HttpProvider(providerUrl));
if (typeof web3 === 'undefined') throw 'No web3 detected. Is Metamask/Mist being used?';
console.log("Using web3 version: " + Web3.version);

let contractDataPromise = MissionTrackerJson;
let networkIdPromise = web3.eth.net.getId(); // resolves on the current network id

Promise.all([contractDataPromise, networkIdPromise])
.then(results => {
    let contractData = results[0];
    let networkId = results[1];

    // Make sure the contract is deployed on the connected network
    if (!(networkId in contractData.networks)) {
        throw new Error("Contract not found in selected Ethereum network on MetaMask.");
    }

    contractAddress = contractData.networks[networkId].address;
    contract = new web3.eth.Contract(contractData.abi, contractAddress);
    app.listen(port, () => console.log(`Site server on port ${port}`));
})
.catch(console.error);

if (production) {
    app.use('/', express.static(`${__dirname}/client/build`));
}

app.get('/api/complete_checkpoint/:reviewer/:checkpoint', (req, res) => {
    let reviewerId = req.params.reviewer;
    let checkpointId = req.params.checkpoint;
    let encodedABI = contract.methods.setCheckpointComplete(reviewerId, checkpointId).encodeABI();

    web3.eth.getTransactionCount(gamePublicKey, 'pending')
    .then(nonce => {
        let rawTx = {
            from: gamePublicKey,
            to: contractAddress,
            gas: 2000000,
            data: encodedABI,
            gasPrice: '100',
            nonce,
        };

        let tx = new Tx(rawTx);
        tx.sign(gamePrivateKey);

        let serializedTx = tx.serialize();

        web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'))
        .on('receipt', console.log)
        .catch(console.error);
    })
});

app.get('/api/add_checkpoint/:checkpoint_name', (req, res) => {
    console.log("hello");
    let checkpointName = decodeURIComponent(req.params.checkpoint_name);
    let encodedABI = contract.methods.addGameCheckpoint(checkpointName).encodeABI();

    web3.eth.getTransactionCount(gamePublicKey, 'pending')
    .then(nonce => {
        let rawTx = {
            from: gamePublicKey,
            to: contractAddress,
            gas: 2000000,
            data: encodedABI,
            gasPrice: '100',
            nonce,
        };

        let tx = new Tx(rawTx);
        tx.sign(gamePrivateKey);

        let serializedTx = tx.serialize();

        web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'))
        .on('receipt', console.log)
        .catch(console.error);
    })
});
console.log("end");

Чтобы вызвать контракт, мне нужно пропинговать сервер методом HTTP GET.Я выяснил, что IP-адрес моего сервера Docker равен 172.17.0.2:8081, когда я запускаю следующую команду:

docker run -t -i --env private=0x12345 --env public=0x11111 -p 8081:8081 game_server

Я делаю свой внешний порт 8081

Как я могуотправить метод HTTP GET на мой сервер?Есть ли какой-то другой адрес, который я должен искать?

Большое спасибо за помощь!

1 Ответ

0 голосов
/ 21 мая 2018

Я думаю, что в вашем Dockerfile все немного беспорядочно:

FROM node:7 WORKDIR /app COPY package.json /app <== this is copying package.json to /app/app...should just be COPY package.json . RUN npm install RUN npm install -g npm <== unnecessary as npm bundles with node RUN ls <== unnecessary COPY . /app <== again, you're copying to /app/app CMD node gameserver.js <== this should go as the last line EXPOSE 8081 <== this should be the second to last line ARG walletPrivate ENV walletPrivate = $private ARG walletPublic ENV walletPublic = $public

Когда вы запускаете контейнер, видите ли вы, что он действительно работает?Так как у вас происходит эта / app / app, я был бы удивлен, если бы команда CMD node gameserver.js действительно нашла файл вашего сервера.

Кроме того, ваш gameserver.js файл ожидает переменную среды PORT, которую вы ''не поставляет.Поскольку он не поставляется, сервер вашего узла прослушивает порт 5001, а не 8081 ... поэтому раскрытие 8081 вам не поможет.Вместо того, чтобы выставлять 8081 из контейнера, добавьте -p "8081:5001" к вашей команде run.Или укажите 8081 в качестве переменной среды.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...