Soy nuevo en docker y mongoDB, así que espero que me falten algunos pasos. Esto es lo que tengo en mi Dockerfile hasta ahora:
FROM python:2.7 RUN apt-get update \ && apt-get install -y mongodb \ && rm -rf /var/lib/apt/lists/* RUN mkdir -p /data/db RUN service mongodb start RUN mongod --fork --logpath /var/log/mongodb.log RUN mongo db --eval 'db.createUser({user:"dbuser",pwd:"dbpass",roles:["readWrite","dbAdmin"]})'La conexión falla en el último comando:
Error: no se pudo conectar al servidor 127.0.0.1:27017 en src/mongo/shell/mongo.js:145 excepción: conexión fallida`.
¿Cómo puedo conectarme con éxito? ¿Debo cambiar el host/IP, ya qué, en qué comandos?
Varias cosas van mal aquí. Primero están los comandos que está ejecutando:
RUN service mongodb start RUN mongod --fork --logpath /var/log/mongodb.logCada uno de estos se ejecutará para crear una capa en la ventana acoplable. Y una vez que regresa el comando que se está ejecutando, el contenedor temporal que se inició se detiene y los archivos modificados en el contenedor se capturan para crear una nueva capa. No hay procesos persistentes que duren entre estos comandos.
Estos comandos también ejecutan la versión en segundo plano de los comandos de inicio. En la ventana acoplable, encontrará que esto es problemático ya que cuando lo usa como el comando de su contenedor, encontrará que el contenedor muere tan pronto como finaliza el comando. Pid 1 en el contenedor tiene el mismo rol que pid 1 en un sistema operativo Linux, una vez que muere, también lo hace todo lo demás.
El segundo problema que veo es mezclar datos con su contenedor en forma de inicialización de la base de datos con el último comando EJECUTAR. Esto falla porque no hay una base de datos en ejecución (ver arriba). En su lugar, recomendaría crear un punto de entrada que configure la base de datos si aún no existe, y luego usar un volumen en su docker-compose.yml o en su línea de comandos de ejecución de docker run para conservar los datos entre contenedores.
Si absolutamente debe inicializar los datos como parte de su imagen, puede intentar fusionar los diversos comandos en una sola ejecución:
RUN mongod --fork --logpath /var/log/mongodb.log \ && mongo db --eval 'db.createUser({user:"dbuser",pwd:"dbpass",roles:["readWrite","dbAdmin"]})'Creo que entendiste mal para qué se usan los Dockerfiles. Como señala la referencia de Dockerfile , un
Dockerfile es un documento de texto que contiene todos los comandos que un usuario podría llamar en la línea de comandos para ensamblar una imagen.
El concepto completo de una imagen es derivar un contenedor en ejecución que luego se llena con datos y se consulta (en el caso de una base de datos) o está siendo llamado por un contenedor / host externo (en el caso de un servicio web) o muchos otros posibles usos
Para responder a tu pregunta , asumiré que:
Desea utilizar una base de datos mongo para almacenar datos.
Tienes un código pyhton que necesita tener acceso a mongo.
Desea algunos datos iniciales en su base de datos.
Para hacerlo:
Ejecutar una base de datos mongo
docker run --name my-mongo -d mongo
Nota: No es necesario escribir una imagen personalizada. ¡Usa la imagen oficial de mongo !
Cree una imagen de python que contenga su script
a) Escribe tu Dockerfile
FROM python:3-alpine ADD my_script.py / RUN pip install any-dependency-you-might-need CMD [ "python", "./my_script.py" ] b) Escriba su my_script.py
Inserte su solicitud aquí. Se ejecutará en el contenedor de python. Y como mongo estará vinculado, puede usar s.th. como client = MongoClient('mongodb://mongo:27017/') para comenzar.
Ejecute su contenedor de python con un enlace a mongo
a) Construirlo:
docker build -t my-pyhthon-magic .b) Ejecutarlo:
docker run -d --name python-magic-container --link my-mongo:mongo my-python-magic Nota: El --link aquí vincula un contenedor en ejecución llamado my-mongo al que se accede internamente en my-python-magic -container como mongo . Es por eso que puede usarlo en su script de python.
Espero que esto te haya ayudado. No dudes en hacer o modificar tu pregunta si te entendí mal.