我正在构建一个 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
有什么想法吗?
问题是您使用了两条
FROM
指令,称为 multi-stage build
。最终图像将基于不包含 node
数据库的 mongo
图像。
* 编辑*
以下是有关正在发生的事情的更多详细信息:
来自 mongo:最新
mongo:latest
来自节点
node:latest
。上一张图片就站在那里......运行 mongod
复制。 .
运行节点./scripts/import-data.js
mongod
以及最终图像中基于 node
(不包含 mongo)的其他命令发生这种情况是因为应该使用多个 FROM 指令进行多阶段构建(检查文档),而不是用于包含所有当前应用程序的图像创建。
多阶段构建为您提供了将构建过程委派到容器环境中的可能性,而无需安装本地应用程序。
FROM rabbitmq
...some instructions require rabbitmq...
FROM mongo:latest
...some instructions require mongo...
换句话说,如果你想用rabbitmq、mongo和其他应用程序创建镜像,你必须选择镜像并手动安装应用程序。
使用
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:
出于某些测试目的,我实际上必须将 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。创建这个
Dockerfile
:
FROM mongo:latest
步骤2。从这个 Dockerfile 创建镜像:
docker build . -t my_mongo_build
这等于
docker run ..... mongo:latest
,用于一些奇怪的场景