Я знаю, это звучит глупо, но мне нужно создать два метеорных проекта, один как «сервер» на порту 8081, а другой - как «клиент» на порту 8080 и запустить оба с докером.
Клиент не должен создавать экземпляр mongodb, так как он должен подключаться к экземпляру сервера.
Я знаю, что сервер автоматически создаст mongodb на порту 8082.
Использование export MONGO_URL=mongodb://127.0.0.1:8082/meteor
отлично работает при запуске по отдельности. Но при использовании Docker он сообщает, что клиент не может подключиться к монго через порт 8082.
То, что я хочу, - это иметь возможность подключить клиента к mongo на 8082 или подключить и клиента, и сервер к полной mongodb через порт 27017.
Вот файлы:
DockerFile сервера:
FROM node:10
ENV METEOR_ALLOW_SUPERUSER=true
ENV ROOT_URL="http://localhost:8081"
RUN curl "https://install.meteor.com/" | sh
COPY . /usr/src/server
WORKDIR /usr/src/server
#RUN chmod -R 700 /usr/src/app/.meteor/local
RUN meteor npm install
EXPOSE 8081
CMD ["npm", "start"]
DockerFile клиента:
FROM node:10
ENV METEOR_ALLOW_SUPERUSER=true
ENV ROOT_URL="http://localhost:8080"
RUN curl "https://install.meteor.com/" | sh
COPY . /usr/src/client
WORKDIR /usr/src/client
#RUN chmod -R 700 /usr/src/app/.meteor/local
RUN meteor npm install
RUN export MONGO_URL=mongodb://127.0.0.1:8082/meteor
EXPOSE 8080
CMD ["npm", "start"]
Docker-compose.yml:
version: "3.3"
services:
server:
build: ./Server
ports:
- "8081:8081"
command: "meteor run -p 8081"
links:
- database
client:
build: ./Client
ports:
- "8080:8080"
command: "meteor run -p 8080"
environment:
- MONGO_URL=mongodb://localhost:8082/meteor
depends_on:
- server
database:
image: mongo:3.6.4
Вот ошибка, которую я получаю:
MongoNetworkError: failed to connect to server [localhost:8082] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:8082]
client_1_a42af00d59c0 | W20190311-15:01:13.496(0)? (STDERR) at Pool.<anonymous> (/root/.meteor/packages/npm-mongo/.3.1.1.v3rpzk.m5kk8++os+web.browser+web.browser.legacy+web.cordova/npm/node_modules/mongodb-core/lib/topologies/server.js:564:11)
client_1_a42af00d59c0 | W20190311-15:01:13.499(0)? (STDERR) at emitOne (events.js:116:13)
client_1_a42af00d59c0 | W20190311-15:01:13.501(0)? (STDERR) at Pool.emit (events.js:211:7)
client_1_a42af00d59c0 | W20190311-15:01:13.502(0)? (STDERR) at Connection.<anonymous> (/root/.meteor/packages/npm-mongo/.3.1.1.v3rpzk.m5kk8++os+web.browser+web.browser.legacy+web.cordova/npm/node_modules/mongodb-core/lib/connection/pool.js:317:12)
client_1_a42af00d59c0 | W20190311-15:01:13.503(0)? (STDERR) at Object.onceWrapper (events.js:317:30)
client_1_a42af00d59c0 | W20190311-15:01:13.504(0)? (STDERR) at emitTwo (events.js:126:13)
client_1_a42af00d59c0 | W20190311-15:01:13.505(0)? (STDERR) at Connection.emit (events.js:214:7)
client_1_a42af00d59c0 | W20190311-15:01:13.506(0)? (STDERR) at Socket.<anonymous> (/root/.meteor/packages/npm-mongo/.3.1.1.v3rpzk.m5kk8++os+web.browser+web.browser.legacy+web.cordova/npm/node_modules/mongodb-core/lib/connection/connection.js:246:50)
client_1_a42af00d59c0 | W20190311-15:01:13.507(0)? (STDERR) at Object.onceWrapper (events.js:315:30)
client_1_a42af00d59c0 | W20190311-15:01:13.508(0)? (STDERR) at emitOne (events.js:116:13)
client_1_a42af00d59c0 | W20190311-15:01:13.509(0)? (STDERR) at Socket.emit (events.js:211:7)
client_1_a42af00d59c0 | W20190311-15:01:13.509(0)? (STDERR) at emitErrorNT (internal/streams/destroy.js:64:8)
client_1_a42af00d59c0 | W20190311-15:01:13.511(0)? (STDERR) at _combinedTickCallback (internal/process/next_tick.js:138:11)
client_1_a42af00d59c0 | W20190311-15:01:13.511(0)? (STDERR) at process._tickDomainCallback (internal/process/next_tick.js:218:9)
Спасибо.
РЕДАКТИРОВАТЬ: Хорошо, спасибо за помощь, но мне удалось это сделать. Вот файлы:
докер-compose.yml
version: "3.3"
services:
client:
build: ./Client
depends_on:
- server
ports:
- "8081:8081"
command: "meteor run -p 8081"
environment:
- MONGO_URL=mongodb://database:27017/meteor
server:
build: ./Server
ports:
- "8080:8080"
command: "meteor run -p 8080"
depends_on:
- api
environment:
- MONGO_URL=mongodb://database:27017/meteor
mobile:
build: ./application
links:
- database
depends_on:
- server
- database
api:
build: ./Client/api
ports:
- "4000:4000"
command: node apiLinks.js 4000 database
links:
- database
depends_on:
- database
database:
image: mongo:3.6.4
Клиент / Dockerfile
FROM node:10
ENV METEOR_ALLOW_SUPERUSER=true
ENV ROOT_URL="http://localhost:8081"
RUN curl "https://install.meteor.com/" | sh
COPY . /usr/src/client
WORKDIR /usr/src/client
#RUN chmod -R 700 /usr/src/app/.meteor/local
RUN meteor npm install
EXPOSE 8081
CMD ["npm", "start"]
Сервер / Dockerfile
FROM node:10
ENV METEOR_ALLOW_SUPERUSER=true
ENV ROOT_URL="http://localhost:8080"
RUN curl "https://install.meteor.com/" | sh
COPY . /usr/src/server
WORKDIR /usr/src/server
#RUN chmod -R 700 /usr/src/app/.meteor/local
RUN meteor npm install
EXPOSE 8080
CMD ["npm", "start"]
И в коде я заменил все URL. Например, вместо http://127.0.0.1:8080
у меня сейчас http://server:8080
.
Вы можете заметить, что сервер сейчас находится на порте 8080, а клиент на порте 8081. Мне пришлось их переключать, это было частью темы, которая изменилась позже.