Desde que me di cuenta de que la aplicación que preparamos se ha ampliado considerablemente, he decidido encontrar un método completamente nuevo para automatizar el proceso de su lanzamiento. Para mí era importante encontrar una solución que permitiera activar nuevas funciones de forma aislada.
Introducción
Descubrir un método más sencillo de automatización de procesos supondría una mejora significativa de mi trabajo, así como del trabajo de todo mi equipo. equipo. Pensé: "¿Por qué no usar Docker?".
Durante la fase de preparación, creé dos configuraciones: una para la aplicación front-end y otra para la API. A continuación puedes ver una presentación de lo que he aprendido durante el proceso de desarrollo.
El primer problema
Quiero tener un repositorio clonado en el contenedor, así que he añadido una clave ssh a través del comando ADD en Dockerfile:
ADD ~/.ssh/testowy
Y ¡bam! El archivo no se encuentra. ¿Por qué?
Supongamos que tenemos la siguiente estructura de carpetas:
docker/
|-- stuff/
| Prueba.txt
|-- Dockerfile
server/
|-- Datos
| setup.yml
Ejecutar comando construya
en el cola de acceso
y sólo puedes añadir archivos de la carpeta local y sus subcarpetas locales, por ejemplo, cosas.
Si desea añadir el servidor
recibirás un mensaje: "no se puede preparar el contexto"
Dockerignore
¿Te has preguntado alguna vez por qué la imagen tarda tanto en construirse? Quizá no usaste .dockerignore
para ignorar los archivos que no son necesarios en la imagen. La dirección .git
debería eliminarse automáticamente, así como los archivos temporales.
Orden de los comandos en Dockerfile
Docker guarda cada línea de forma Dockerfile y después de la construcción de cada línea se guarda como una capa. Es muy importante no cambiar el orden de los comandos particulares con demasiada frecuencia.
DESDE ubuntu
EJECUTAR apt-get install -y software-properties-common python
EJECUTAR add-apt-repository ppa:chris-lea/node.js
RUN echo "deb http://us.archive.ubuntu.com/ubuntu/ precise universe" >> /etc/apt/sources.list
EJECUTAR apt-get update
EJECUTAR apt-get install -y nodejs
RUN apt-get install -y nodejs=0.6.12~dfsg1-1ubuntu1
RUN mkdir /var/www
ADD app.js /var/www/app.js
CMD ["/usr/bin/node", "/var/www/app.js"]
Por ejemplo, si cambia la última línea en Dockerfile, todas las líneas anteriores se descargarán de la caché mientras que la última línea se modificará. Si sustituye la línea nº 4, se modificarán todas las líneas desde la línea 4 hasta el final. Por esta razón vale la pena colocar los comandos que no cambiarán, al principio del archivo.
Copiar archivos a la imagen
Conviene tener en cuenta para qué se va a utilizar una imagen determinada. Si la necesitas para lanzar un servicio una vez, sólo tienes que copiar la imagen código directamente a la imagen:
COPIA . /carpeta
Desafortunadamente, esto hace imposible editar los archivos y cada vez que quieras editar tu código, tendrás que construir la imagen de nuevo.
Si estás usando MacOS y quieres usar la imagen construida para desarrollo, tienes que enfocar este asunto de una manera ligeramente diferente. Si vas a utilizar volúmenes, entonces tienes que estar preparado para que esta sea una solución extremadamente lenta (por ejemplo, la copia de un archivo desde el host al contenedor se realiza con una velocidad de 4,5 MB/s, mientras que la copia interna en el contenedor con una velocidad 10-20 veces superior). Por suerte, como puedes ver en enlace, el problema ha sido conocido y su solución es la cuestión clave para el equipo responsable del desarrollo de Docker para Mac.
¿Cómo se puede utilizar Docker para el desarrollo en esta situación?
Puedes utilizarlo para servicios externos, por ejemplo Redis/PSQL/Elasticsearch o utilizar soluciones preparadas, que ofrecen rsync: https://github.com/brikis98/docker-osx-dev
En resumen
Si tiene un equipo grande y desea probar una nueva función, docker será la herramienta ideal. Sin embargo, ¿la utilizaría para el lanzamiento en producción de un servidor? Aún no estoy totalmente convencido...
Además, recomiendo algunos artículos destacados: