Как запустить mongodb из dockerfile - PullRequest
1 голос
/ 20 июня 2019

Я создаю докер-файл.Но я сталкиваюсь с проблемой.Там написано, что:

/ bin / sh: 1: mongod: не найдено

Мой dockerfile:

FROM mongo:latest
FROM node

RUN mongod

COPY . .
RUN node ./scripts/import-data.js

Вот что происходит, когдасборка докера:

Sending build context to Docker daemon  829.5MB
Step 1/8 : FROM rabbitmq
 ---> e8261c2af9fe
Step 2/8 : FROM portainer/portainer
 ---> 00ead811e8ae
Step 3/8 : FROM docker.elastic.co/elasticsearch/elasticsearch:6.5.1
 ---> 32f93c89076d
Step 4/8 : FROM mongo:latest
 ---> 5976dac61f4f
Step 5/8 : FROM node
 ---> b074182f4154
Step 6/8 : RUN mongod
 ---> Running in 0a4b66a77178
/bin/sh: 1: mongod: not found
The command '/bin/sh -c mongod' returned a non-zero code: 127

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 20 июня 2019

Это происходит потому, что несколько команд FROM должны использоваться для Многоступенчатая сборка (см. Документацию) , а НЕ для создания образа содержит все существующие приложения.

Многоступенчатые сборки предоставляют вам возможность делегированияпроцесс сборки в среде контейнера без локальной установки приложения.

FROM rabbitmq

...some instructions require rabbitmq...

FROM mongo:latest

...some instructions require mongo...

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

1 голос
/ 20 июня 2019

Используйте docker-compose (https://docs.docker.com/compose/install/) для запуска изображений, а не пытайтесь создать новое изображение из коллекции существующих изображений. Ваш docker-compose.yml может выглядеть примерно так:

version: '3.7'
services:
  portainer:
    image: 'portainer/portainer'
    container_name: 'portainer'
    hostname: 'portainer'
    domainname: 'example.com'
    volumes:
    - '/var/run/docker.sock:/var/run/docker.sock'
    - 'portainer_data:/data'
    ports:
    - '9000:9000'
  rabbitmq:
    image: 'rabbitmq'
    container_name: 'rabbitmq'
    hostname: 'rabbitmq'
    domainname: 'example.com'
    volumes:
    - 'rabbitmq_data:/var/lib/rabbitmq'
  elasticsearch:
    image: 'elasticsearch:7.1.1'
    container_name: 'elasticsearch'
    hostname: 'elasticsearch'
    domainname: 'example.com'
    environment:
    - 'discovery.type=single-node'
    volumes:
    - 'elasticsearch_data:/usr/share/elasticsearch/data'
    ports:
    - '9200:9200'
    - '9300:9300'
  node:
    image: 'node:12'
    container_name: 'node'
    hostname: 'node'
    domainname: 'example.com'
    user: 'node'
    working_dir: '/home/node/app'
    environment:
    - 'NODE_ENV=production'
    volumes:
    - './my-app:/home/node/app'
    ports:
    - '3000:3000'
    command: 'npm start'
  mongo:
    image: 'mongo'
    container_name: 'mongo'
    hostname: 'mongo'
    domainname: 'example.com'
    restart: 'always'
    environment:
    - 'MONGO_INITDB_ROOT_USERNAME=root'
    - 'MONGO_INITDB_ROOT_PASSWORD=example'
    volumes:
    - 'mongo_data:/data/db'
volumes:
  portainer_data:
  rabbitmq_data:
  elasticsearch_data:
  mongo_data:
1 голос
/ 20 июня 2019

Проблема в том, что вы используете две FROM инструкции, которые называются multi-stage build. Окончательное изображение будет основано на изображении node, которое не содержит базу данных mongo.

* Редактировать *

вот более подробно о происходящем:

ОТ Монго: последний

  • базовое изображение mongo:latest

ОТ узла

  • теперь базовое изображение node:latest. Предыдущее изображение просто стоит там ...

RUN mongod

КОПИЯ. .

узел RUN ./scripts/import-data.js

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