如何从dockerfile启动mongodb

问题描述 投票:0回答:5

我正在构建一个 dockerfile。但我遇到了一个问题。它说:

/bin/sh:1:mongod:未找到

我的dockerfile:

FROM mongo:latest
FROM node

RUN mongod

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

这是 docker 构建时发生的情况:

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

有什么想法吗?

mongodb docker
5个回答
5
投票

问题是您使用了两条

FROM
指令,称为
multi-stage build
。最终图像将基于不包含
node
数据库的
mongo
图像。

* 编辑*

以下是有关正在发生的事情的更多详细信息:

来自 mongo:最新

  • 基础图像是
    mongo:latest

来自节点

  • 现在基础图像是
    node:latest
    。上一张图片就站在那里......

运行 mongod

复制。 .

运行节点./scripts/import-data.js

  • 现在您运行
    mongod
    以及最终图像中基于
    node
    (不包含 mongo)的其他命令

2
投票

发生这种情况是因为应该使用多个 FROM 指令进行多阶段构建(检查文档),而不是用于包含所有当前应用程序的图像创建。

多阶段构建为您提供了将构建过程委派到容器环境中的可能性,而无需安装本地应用程序。

FROM rabbitmq

...some instructions require rabbitmq...

FROM mongo:latest

...some instructions require mongo...

换句话说,如果你想用rabbitmq、mongo和其他应用程序创建镜像,你必须选择镜像并手动安装应用程序。


2
投票

使用

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:

0
投票

出于某些测试目的,我实际上必须将 MongoDB 和 NodeJS 塞进同一个容器中。

我首先尝试使用基于 Alpine 的 Node 镜像

FROM node:20-alpine3.19

但发现你无法通过

apk
命令导入 Mongo,因为它在最新的 Alpine 上不再可用。

因此我反其道而行之,从基于 Ubuntu 的 Mongo 镜像开始,使用

apt-get
导入镜像中的
node
npm

FROM mongo:7.0.7
RUN apt-get update
RUN apt-get install curl
RUN curl -fssL https://deb.nodesource.com/setup_20.x | bash
RUN apt-get install -y nodejs

注意:为了便于阅读,我将 RUN 命令分开,但您可能希望在同一命令中执行所有内容以避免不需要的层:

FROM mongo:7.0.7
RUN apt-get update; apt-get install curl; curl -fssL https://deb.nodesource.com/setup_20.x | bash; apt-get install -y nodejs

-1
投票

我明白了,很简单

步骤1。创建这个

Dockerfile

FROM mongo:latest

步骤2。从这个 Dockerfile 创建镜像:

docker build . -t my_mongo_build

这等于

docker run ..... mongo:latest
,用于一些奇怪的场景

© www.soinside.com 2019 - 2024. All rights reserved.