Расширьте образ Prisma Docker с помощью еще одного слоя экспресс-образа узла

У меня есть образ сервера Prisma из dockerhub, который

prismagraphql/prisma:1.34

Приведенное выше изображение призмы для работы на PORT 4466 требует строки подключения к базе данных, и она передается в качестве переменной среды с использованием файла docker-compose, как показано ниже.

prisma:
   image: prismagraphql/prisma:1.34   
   ports:
     - "4466:4466"     
   environment:
     PRISMA_CONFIG: |
       port: 4466
       databases:
         default:
           connector: mongo
           uri: mongodb://mongodb   

Я пытаюсь расширить приведенное выше изображение сервера призмы, как показано ниже.

FROM prismagraphql/prisma:1.34

RUN apk add  --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/v3.7/main/ nodejs=8.9.3-r1

WORKDIR /project

COPY . .

# To handle 'not get uid/gid' error in alpine linux set unsafe-perm true
RUN apk update && apk upgrade \
    && npm config set unsafe-perm true \
    && npm install --g yarn \
    && npm install -g prisma \
    && yarn install \
    && chmod +x ./entrypoint.sh \
    && chmod +x ./wait-for-it.sh

EXPOSE 4466 4000

ENTRYPOINT ["./entrypoint.sh"]

Файл entrypoint.sh выглядит следующим образом

#!/bin/bash

# wait for the prisma service to start.
# then run prisma deploy (more on that later)
./wait-for-it.sh prisma:4466 -- prisma deploy

# go into the project...
cd /project

# run an npm command to use nodemon to start/watch the server
npm run start

В приведенном выше Dockerfile

  • Я пытаюсь установить приложение nodejs на существующий образ призмы из dockerhub.

  • Это приложение nodejs называется prisma nexus. nexus требует подключения к prisma на localhost: 4466, а nexus работает на порту 4000.

Когда я запускаю изображение ниже, я получаю эту ошибку. Т.е. nexus (приложение nodejs) не может подключиться к призме

Could not connect to server at http://localhost:4466. Please check if your server is running.

Наконец, я запускаю расширенное изображение вот так


 mongodb:
   image: mongo:4.2
   container_name: mongodb
   volumes:
     - ./mongo-volume:/data/db
   ports:
     - "27017:27017"
   networks:
     - prisma

  prisma:
   image: extended-image-here:1.0
   container_name: prisma-server
   restart: always
   ports:
     - "4466:4466"
     - "4000:4000"
   environment:
     PRISMA_CONFIG: |
       port: 4466
       databases:
         default:
           connector: mongo
           uri: mongodb://mongodb

Что я здесь делаю? Пожалуйста помоги.


person jeril    schedule 21.03.2020    source источник
comment
Как запустить расширенное изображение?   -  person Sniper    schedule 21.03.2020
comment
с помощью docker-compose .. Я обновил вопрос о том, как запустить расширенный образ   -  person jeril    schedule 21.03.2020
comment
Вы пробовали запустить приложение nexus nodejs только с изображением призмы? Я имею в виду запуск приложения nodejs локально (не в контейнере)   -  person Sniper    schedule 21.03.2020
comment
да, я пробовал запустить приложение nodejs в контейнере. Я использовал ENTRYPOINT [./entrypoint.sh]. Обновлен код entrypoint.sh. entrypoint.sh вызывает другой скрипт ./wait-for-it.sh, который проверяет, готова ли prisma на порту: 4466, и запускает приложение nodejs в контейнере.   -  person jeril    schedule 21.03.2020
comment
каково содержание ./wait-for-it.sh   -  person Al-waleed Shihadeh    schedule 21.03.2020
comment
wait-for-it.sh - это чистый сценарий bash, который будет ожидать доступности хоста и порта TCP. Это полезно для синхронизации развертывания взаимозависимых служб, таких как связанные контейнеры докеров. Поскольку это чистый сценарий bash, он не имеет внешних зависимостей. github.com/vishnubob/wait-for-it   -  person jeril    schedule 21.03.2020
comment
Нет, это означает, что просто запустите первый файл компоновки докеров, содержащий только призму (не расширенную), затем попробуйте подключить нексус вручную с помощью npm start на вашем локальном компьютере, а не внутри какого-либо контейнера. Вы все еще получаете ту же ошибку?   -  person Sniper    schedule 21.03.2020
comment
Нет, я не хочу этого делать .. Я хочу объединить изображение призмы и nodejs в одно изображение. Есть ситуация, когда мне нужно установить это приложение на нескольких машинах, и если я смогу объединить обе эти службы в один образ, мне будет проще.   -  person jeril    schedule 21.03.2020
comment
похоже, что эта строка работает не так, как ожидалось ./wait-for-it.sh prisma:4466 -- prisma deploy. по какой-то причине вам все еще нравился localhost, а не prisma.   -  person Al-waleed Shihadeh    schedule 21.03.2020
comment
подождите секунду, в prisma контейнере докеров вы реализуете ожидание для контейнера `prisma. Это похоже на петлю   -  person Al-waleed Shihadeh    schedule 21.03.2020
comment
проверит удаление этого сценария ... но я думаю, что основная причина его неудачи в том, что он имеет несколько точек входа. Основное базовое изображение prisma имеет точку входа, подобную этой / bin / sh -c / app / staâ¦, а указанный выше файл Docker имеет точку входа, подобную этой ENTRYPOINT [./entrypoint.sh]. Таким образом, последняя точка входа переопределяет точку входа базового изображения. Это заставляет ./wait-for-it.sh продолжать ждать, поскольку prisma: 4466 не работает   -  person jeril    schedule 21.03.2020
comment
Вам не нужен wait-for-it.sh - compose имеет встроенный механизм зависимостей.   -  person Software Engineer    schedule 21.03.2020


Ответы (2)


Я предполагаю, что причина, по которой это не работает, заключается в том, что изображение prismagraphql / prisma: 1.34 имеет точку входа, а в конце файла Docker есть еще одна точка входа. Docker принимает только одну точку входа в Dockerfile ...

person jeril    schedule 21.03.2020

Во-первых: в вашем коде вы помещаете контейнер MongoDB в определенную именованную сеть с именем prisma, но вы не делаете то же самое с контейнером prisma. При использовании compose контейнеры в одной оверлейной сети разрешаются по имени, но запросы будут маршрутизироваться между контейнерами только в том случае, если они находятся в одной сети.

Далее: вы не должны запускать два сервера в одном контейнере. Лучше вообще не создавать свое приложение поверх образа призмы, а вместо этого создавать его поверх alpine или ubuntu (или чего-то еще). Он должен подключиться к другому контейнеру, в котором работает сервер prisma. В комментариях вы говорите, что очень хотите это сделать, но на самом деле не стоит. Не намного сложнее запустить конфигурацию компоновки на сервере клиента, чем на одном контейнере, но гораздо сложнее запустить 2 сервера в одном контейнере.

Наконец: ссылка localhost (вы говорите, нексус?) Должна быть каким-то образом настраиваемой. Узнайте, как это сделать, и попросите его адресовать что-то вроде "http://prisma:4466". Таким образом, у вас будет 3 контейнера - mongodb, prisma и ваше собственное приложение.

person Software Engineer    schedule 21.03.2020