riak - imagen - ejecutar un docker file
Ejecuta un servicio automáticamente en un contenedor de docker (6)
Estoy configurando una imagen simple: una que contiene Riak (una base de datos NoSQL). La imagen inicia el servicio de Riak con riak start
como CMD. Ahora, si lo ejecuto como daemon con docker run -d quintenk/riak-dev
, comienza el proceso de Riak (puedo verlo en los registros). Sin embargo, se cierra automáticamente después de unos segundos. Si lo ejecuto usando docker run -i -t quintenk/riak-dev /bin/bash
el proceso de riak no se inicia (UPDATE: vea las respuestas para obtener una explicación de esto). De hecho, no hay servicios funcionando en absoluto. Puedo iniciarlo manualmente usando la terminal, pero me gustaría que Riak se inicie automáticamente. Me imagino que este comportamiento también ocurriría para otros servicios, Riak es solo un ejemplo.
Por lo tanto, ejecutar / reiniciar el contenedor debería iniciar Riak automáticamente. ¿Cuál es el enfoque correcto para configurar esto?
Como referencia, aquí está el archivo Docker con el que se puede crear la imagen (ACTUALIZACIÓN: alterada con la respuesta elegida):
FROM ubuntu:12.04
RUN apt-get update
RUN apt-get install -y openssh-server curl
RUN curl http://apt.basho.com/gpg/basho.apt.key | apt-key add -
RUN bash -c "echo deb http://apt.basho.com precise main > /etc/apt/sources.list.d/basho.list"
RUN apt-get update
RUN apt-get -y install riak
RUN perl -p -i -e ''s/(?<=/{http,/s/[/s/{")127/.0/.0/.1/0.0.0.0/g'' /etc/riak/app.config
EXPOSE 8098
CMD /bin/riak start && tail -F /var/log/riak/erlang.log.1
EDITAR: -f cambiado a -F en CMD de acuerdo con sesm su comentario
MI PROPIA RESPUESTA
Después de trabajar con Docker por algún tiempo, adquirí el hábito de usar supervisord para ajustar mis procesos. Si desea un código de ejemplo para eso, consulte https://github.com/Krijger/docker-cookbooks . Uso mi imagen de supervisor como base para todas mis otras imágenes. Publiqué un blog sobre el uso de un supervisor here .
"Si lo ejecuto usando docker run -i -t quintenk / riak-dev / bin / bash, el proceso de riak no se inicia"
Parece que solo desea poder supervisar el registro cuando se conecta al contenedor. Mi caso de uso es un poco diferente porque quiero que los comandos se inicien automáticamente, pero quiero poder adjuntarme al contenedor y estar en un shell bash. Pude resolver nuestros dos problemas de la siguiente manera:
En la imagen / contenedor, agregue los comandos que desea que /etc/bash.bashrc
automáticamente al final del archivo /etc/bash.bashrc
.
En su caso, simplemente agregue la línea /bin/riak start && tail -F /var/log/riak/erlang.log.1
, o ponga /bin/riak start
y tail -F /var/log/riak/erlang.log.1
en líneas separadas dependiendo de la funcionalidad deseada.
Ahora ingrese los cambios en su contenedor y ejecútelo de nuevo con: docker run -i -t quintenk/riak-dev /bin/bash
. Encontrarás que los comandos que pones en el bashrc ya se están ejecutando mientras los adjuntas.
Debido a que quiero una forma limpia de hacer que el proceso salga más tarde, hago que el último comando sea una llamada a la read
del caparazón, lo que hace que ese proceso se bloquee hasta que más tarde lo conecte y presione enter.
arthur@macro:~/docker$ sudo docker run -d -t -i -v /raid:/raid -p 4040:4040 subsonic /bin/bash -c ''service subsonic start && read -p "waiting"''
WARNING: Docker detected local DNS server on resolv.conf. Using default external servers: [8.8.8.8 8.8.4.4]
f27229a260c9
arthur@macro:~/docker$ sudo docker ps
[sudo] password for arthur:
ID IMAGE COMMAND CREATED STATUS PORTS
35f253bdf45a subsonic:latest /bin/bash -c service 2 days ago Up 2 days 4040->4040
arthur@macro:~/docker$ sudo docker attach 35f253bdf45a
arthur@macro:~/docker$ sudo docker ps
ID IMAGE COMMAND CREATED STATUS PORTS
como puede ver, el contenedor sale después de conectarlo y desbloquear la lectura. Por supuesto, puede usar un script más sofisticado que read -p
si necesita hacer otra limpieza, como detener servicios y guardar registros, etc.
La explicación para:
Si lo ejecuto usando
docker run -i -t quintenk/riak-dev /bin/bash
el proceso de riak no se inicia
es como sigue. Usar CMD en Dockerfile es en realidad la misma funcionalidad que iniciar el contenedor usando docker run {image} {command}
. Como Gigablah comentó, solo se utiliza la última CMD, por lo que la escrita en Dockerfile se sobrescribe en este caso.
Al usar CMD /bin/riak start && tail -f /var/log/riak/erlang.log.1
en Buildfile, puede iniciar el contenedor como un proceso en segundo plano utilizando docker run -d {image}
, que funciona como un encanto.
Para mantener los contenedores acoplables en ejecución, debe mantener un proceso activo en primer plano.
Entonces probablemente puedas reemplazar esa última línea en tu archivo Docker con
CMD /bin/riak console
O incluso
CMD /bin/riak start && tail -F /var/log/riak/erlang.log.1
Tenga en cuenta que no puede tener múltiples líneas de declaraciones CMD, solo la última se ejecuta.
Usar cola para mantener vivo el contenedor es un truco. Además, tenga en cuenta que con el contenedor de opciones -f
terminará cuando ocurra la rotación de registros (esto se puede evitar utilizando -F
lugar).
Una mejor solución es usar supervisor . Eche un vistazo a este tutorial sobre cómo ejecutar Riak en un contenedor Docker.
Utilizo un truco simple cada vez que empiezo a construir un nuevo contenedor acoplable. Para mantenerlo vivo, utilizo un ping en el script de punto de entrada.
Entonces en Dockerfile, cuando uso Debian, por ejemplo, me aseguro de poder hacer ping. Esto es por cierto, siempre es bueno, para comprobar qué se puede acceder desde dentro del contenedor.
...
RUN DEBIAN_FRONTEND=noninteractive apt-get update /
&& apt-get install -y iputils-ping
...
ENTRYPOINT ["entrypoint.sh"]
Y en el archivo entrypoint.sh
#!/bin/bash
...
ping 10.10.0.1 >/dev/null 2>/dev/null
Uso esto en lugar de CMD bash
, ya que siempre termino usando un archivo de inicio.