Estoy construyendo un dockerfile. Pero me encuentro con un problema. Dice que :
/bin/sh: 1: mongod: no encontrado
Mi archivo acoplable:
FROM mongo:latest FROM node RUN mongod COPY . . RUN node ./scripts/import-data.jsEsto es lo que sucede cuando se compila la ventana acoplable:
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: 127Alguna idea ?
El problema es que está utilizando dos instrucciones FROM , lo que se conoce como multi-stage build . La imagen final se basará en la imagen del node que no contiene la base de datos mongo .
* Editar *
Aquí hay más detalles sobre lo que está sucediendo:
DE mongo: más reciente
mongo:latestDESDE nodo
node:latest . La imagen anterior está parada ahí...EJECUTAR mongod
COPIAR . .
EJECUTAR nodo ./scripts/import-data.js
mongod y los otros comandos en su imagen final que se basa en el node (que no contiene mongo)Ocurre porque se deben usar múltiples instrucciones FROM para Multistage Build (consulte la documentación) y NO para la creación de imágenes que contienen todas las aplicaciones actuales.
Las compilaciones de varias etapas le brindan la posibilidad de delegar el proceso de creación en el entorno del contenedor sin la instalación de la aplicación local.
FROM rabbitmq ...some instructions require rabbitmq... FROM mongo:latest ...some instructions require mongo...En otras palabras, si desea crear una imagen con rabbitmq, mongo y otra aplicación, debe elegir la imagen e instalar las aplicaciones manualmente.
Utilice docker-compose ( https://docs.docker.com/compose/install/ ) para ejecutar las imágenes en lugar de intentar crear una nueva imagen a partir de una colección de imágenes existentes. Su docker-compose.yml podría verse así:
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: