У меня есть это приложение React/Nodejs, которое я пытаюсь развернуть в Digital Ocean с помощью Docker. Я создал Docker Droplet с 2 ГБ ОЗУ, клонировал проект и попытался запустить его.
К настоящему времени я не получаю никаких журналов ошибок при создании образа и его запуске. Но, когда я пытаюсь получить к нему доступ, я получаю ошибку в браузере «Этот сайт недоступен».
Я строю свой образ так: docker build -t myImage .
И запустите его и передайте мои переменные env следующим образом:
docker run -p 80:3000 -e NODE_ENV = "production" -e MONGO_URI = "URI" -e SECRET_OR_KEY = "KEY" myImage
Вроде бы все работает нормально (сборка и запуск). Я получаю журнал о том, что мой mongodb подключен и сервер работает. Но на самом деле я не вижу приложения.
Это мой Dockerfile:
FROM node:11.10.0
WORKDIR /usr/src
RUN git clone https://github.com/repo.git
WORKDIR /usr/src/project
RUN npm install
WORKDIR /usr/src/project/client
RUN npm install
RUN npm run build
WORKDIR /usr/src/project
EXPOSE 80 3000
ENTRYPOINT npm run server
Я создал это на основе другого приложения, которое также работает в Digital Ocean.
А это мой server.js:
const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const passport = require('passport');
const path = require('path');
//Route files
const users = require('./routes/api/users');
const fpsos = require('./routes/api/fpsos');
const bids = require('./routes/api/bids');
const news = require('./routes/api/news');
const app = express();
//Body parser middlewares
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json ());
//DB config
const db = require('./config/keys').mongoURI;
//Connect to MongoDB
mongoose
.connect(db)
.then(() => console.info('MongoDB connected'))
.catch(err => console.info(err));
//Passport middleware
app.use(passport.initialize());
//Passport Config
require('./config/passport')(passport);
app.use('/api/users', users);
app.use('/api/news', news);
app.use('/api/fpso', fpsos);
app.use('/api/bid', bids);
// Server static assets if in production
if (process.env.NODE_ENV === 'production') {
// Set static folder
app.use(express.static('client/build'));
app.get('*', (req, res) => {
res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
});
}
const port = process.env.PORT || 5000;
app.listen(port, () => console.info(`Server running on port ${port}`))
Что мне здесь не хватает? Я ценю любую помощь. Заранее спасибо!
Спасибо за ваш ответ @CoolestNerdIII. Действительно, он работает на 5000 (думаю, я имел в виду порт реакции, когда пытался его запустить). Я изменил параметры моей команды запуска, и теперь я вижу журнал ошибок в своем контейнере, когда пытаюсь получить доступ к странице. Но теперь я получаю эту ошибку: '/usr/src/project/client/build/index.html'. Вы знаете, что это может быть?
Эта ошибка, по-видимому, основана на res.sendFile, где вы возвращаете файл index.html. Я бы посоветовал вам либо попытаться запустить контейнер докеров локально, чтобы подтвердить путь, либо вы можете попробовать указать абсолютный путь, чтобы увидеть, решит ли это проблему, но на самом деле кажется, что файл не найден.
Да, моя сборка на самом деле не запускалась во время сборки образа. Я настроил это, и теперь на сервере все работает отлично. Большое спасибо @CoolestNerdIII
Потрясающий! Я предоставлю свои комментарии в ответе, чтобы другие могли знать, что это решило.
Я отмечу это как правильный ответ. Большое спасибо





Похоже, что у вас есть докер, прослушивающий порт, отличный от вашего приложения узла (3000) (5000), поэтому узел не возвращает никаких данных в браузер.
У вас есть докер, прослушивающий порт 3000, но ваше приложение NodeJS, похоже, прослушивает порт 5000, если только вы не передаете где-то переменную среды PORT.