Команда mongoimport не найдена при запуске кода в докере с использованием образа alpine

У меня есть файл докеров для кода node js, как показано ниже

FROM node:10.14-alpine as buildcontainer

RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.9/main' >> /etc/apk/repositories
RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.9/community' >> /etc/apk/repositories
RUN apk update
RUN apk add mongodb

RUN mongo --version
# RUN apt-get update
# RUN apt-get install -y mongodb
# RUN apt-get install -y npm
# RUN apt-get install -y nodejs

COPY source-code/config /home/app/config
COPY source-code/src /home/app/src
COPY source-code/package.json /home/app/package.json
COPY source-code/tsconfig.json /home/app/tsconfig.json
COPY source-code/tsconfig.build.json /home/app/tsconfig.build.json
WORKDIR /home/app
RUN npm install

FROM buildcontainer as tester
COPY . /home/app
WORKDIR /home/app

FROM tester as dev
WORKDIR /home/app
RUN npm run build
ENTRYPOINT ["/usr/local/bin/npm", "run", "start"]

Файл Docker-compose ниже: -

version: '3.4'
services:
  mongodb-load-service:
    image: mongodb-load-service
    container_name: mongodb-load-service
    build:
      context: .
      target: dev
    depends_on:
      - mongo
    ports:
      - "8080:8080"
    links:
      - mongo
    networks: 
      - backend
    environment:
      - MONGODB_URI=mongodb://mongo/test
      - MONGO_HOST=localhost:27017
  mongo:
    image: mongo:latest
    container_name: mongo
    ports:
      - 27017:27017
    networks: 
      - backend
networks:
  backend:
    driver: "bridge"

Я использую команду mongoimport в коде node js для импорта файлов csv в mongodb. Код работает нормально, когда я запускаю локальную среду разработки (без докера), но не когда я запускаю файл сборки докера.

Я получаю следующую ошибку: -

mongo                   | 2019-11-22T13:27:56.606+0000 I  NETWORK  [conn1] received client metadata from 172.18.0.3:59994 conn1: { driver: { name: "nodejs", version: "3.3.4" }, os: { type: "Linux", name: "linux", architecture: "x64", version: "5.0.0-32-generic" }, platform: "'Node.js v10.14.2, LE (unified)" }
mongodb-load-service    | Error occured
mongodb-load-service    | { Error: Command failed: mongoimport -d test -c data --type csv --file files/Mock_Members-a4ae.csv --headerline --host localhost:27017
mongodb-load-service    | /bin/sh: mongoimport: not found
mongodb-load-service    | 
mongodb-load-service    |     at ChildProcess.exithandler (child_process.js:294:12)
mongodb-load-service    |     at ChildProcess.emit (events.js:182:13)
mongodb-load-service    |     at maybeClose (internal/child_process.js:962:16)
mongodb-load-service    |     at Process.ChildProcess._handle.onexit (internal/child_process.js:251:5)
mongodb-load-service    |   killed: false,
mongodb-load-service    |   code: 127,
mongodb-load-service    |   signal: null,
mongodb-load-service    |   cmd:
mongodb-load-service    |    'mongoimport -d test -c data --type csv --file files/Mock_Members-a4ae.csv --headerline --host localhost:27017',
mongodb-load-service    |   stdout: '',
mongodb-load-service    |   stderr: '/bin/sh: mongoimport: not found\n' }

В локальном dev env. Я установил следующие пакеты для успешного выполнения кода:

sudo apt-get install -y mongodb-server-core
sudo apt install mongodb-clients
sudo apt install mongo-tools

Но когда я запускаю те же команды через Dockerfile, используя

RUN apk add mongodb-server-core

Это дает некоторую недостающую ошибку.

Пожалуйста помоги.


person iAviator    schedule 22.11.2019    source источник
comment
Чтобы запустить его, в образе должен быть установлен клиентский инструмент; установка на ваш хост ничего не помогает. pkgs.alpinelinux.org/packages может помочь вам найти подходящий пакет, или вы можете переключить изображение на быть основанным на Debian или Ubuntu. Возможно, вам не нужен установленный серверный пакет.   -  person David Maze    schedule 22.11.2019
comment
Вероятно, мне нужно указать параметр --host в команде mongoimport. --host должен указывать на контейнер докеров mongo. В образе mongo работает команда mongoimport. Поэтому мне просто нужно указать в моем коде, что команда mongoimport запускается на хосте контейнера mongo.   -  person iAviator    schedule 22.11.2019
comment
Было бы полезно опубликовать "какую-то недостающую ошибку"   -  person Quinten Scheppermans    schedule 22.11.2019
comment
ОШИБКА: невыполнимые ограничения: mongodb (отсутствует): требуется: world [mongodb]   -  person iAviator    schedule 22.11.2019
comment
Я предполагаю, что один из ваших пакетов доступен только в репозиториях Edge alpine (или не доступен вообще). apk может получить их только из стабильных репозиториев.   -  person Quinten Scheppermans    schedule 22.11.2019
comment
Используя этот stackoverflow.com/questions/53850369/ Я установил mongod в образе alpine. Но все равно ошибка такая же. Команда Mongoimport не найдена.   -  person iAviator    schedule 22.11.2019
comment
Мне нужно увидеть часть вашего файла докеров, в которой вы фактически пытаетесь установить mongo-tools (это пакет, в котором должна быть команда mongoimport). Вы можете редактировать свой пост.   -  person Quinten Scheppermans    schedule 22.11.2019
comment
Обновлен dockerfile. Также добавлена ​​подробная ошибка для команды mongoimport not found.   -  person iAviator    schedule 22.11.2019


Ответы (1)


Добавьте в файл докеров следующее:

RUN echo 'http://dl-cdn.alpinelinux.org/alpine/v3.9/community' >> /etc/apk/repositories
RUN apk add mongodb-tools
person Quinten Scheppermans    schedule 22.11.2019
comment
Это сработало. Теперь получаю эту ошибку. mongodb-load-сервис | {Ошибка: сбой команды: mongoimport -d test -c data --type csv --file files / Mock_Members-5e410.csv --headerline --host localhost: 27017 Ошибка: ошибка подключения к серверу базы данных: недоступные серверы - person iAviator; 22.11.2019
comment
MONGODB_URI = mongodb: // mongo / test, вы можете подключиться к другому докер-контейнеру в той же сети, заменив его имя хоста его именем контейнера. Итак, в вашем случае это будет MONGODB_URI: mongo: // ......... Но они также должны быть в одной сети, поэтому добавьте сеть в свой файл создания и добавьте к нему оба ваших контейнера. - person Quinten Scheppermans; 22.11.2019
comment
Другая проблема, которая может у вас возникнуть, заключается в том, что ваш контейнер семян пытается подключиться к вашему контейнеру mongo, который все еще запускается. Чтобы немного помочь в этом, вы можете добавить в контейнер с семенами тег depends_on. Это не всегда сработает, поскольку влияет только на порядок сборки контейнера, а не на порядок выполнения приложений внутри. - person Quinten Scheppermans; 22.11.2019
comment
используя --host как mongo: 27017, и не могли бы вы сообщить мне, какая сеть будет добавлена ​​в docker-compose? Как это сделать: - networks: default: driver: custom-driver-1 - person iAviator; 22.11.2019
comment
Вам не нужен специальный драйвер, этот ответ stackoverflow поможет вам: stackoverflow.com/questions/38088279/ - person Quinten Scheppermans; 22.11.2019
comment
Извините, но я не могу помочь вам с другой проблемой в этой теме. Это противоречит политике Stackoverflow. Если вам нужна помощь с этой проблемой, вам нужно будет открыть другую. Вы можете связать это здесь, если хотите. - person Quinten Scheppermans; 22.11.2019