Copie un directorio del host a una imagen de Docker

David Mbochi Njonge 20 junio 2023
  1. Crear una aplicación Express
  2. Utilice la instrucción AÑADIR
  3. Utilice la Instrucción COPY
  4. Utilice una alternativa a la instrucción ADD
Copie un directorio del host a una imagen de Docker

La documentación de Docker define a Docker como una herramienta independiente de la infraestructura que ayuda a los desarrolladores a desarrollar, enviar y ejecutar aplicaciones de la manera más rápida posible.

Además de estos beneficios, los desarrolladores de DevOps también usan Docker en la integración, entrega e implementación continuas. Este enfoque de desarrollo generalmente se denomina CI/CD, y los desarrolladores usan contenedores para desarrollar, probar e implementar cambios o características en producción.

Los errores en una aplicación se corrigen en el entorno de desarrollo. Una vez hecho esto, las pruebas de automatización se ejecutan en el entorno de prueba. Finalmente, la imagen con nuevos cambios se implementa en producción cuando todas las pruebas han pasado.

Este tutorial nos enseñará cómo copiar un directorio desde la máquina host a una imagen acoplable. Usaremos una aplicación rápida que devuelve una API para realizar esto.

Crear una aplicación Express

Abra Intellij IDEA. Seleccione Archivo -> Nuevo -> Proyecto. En una ventana que se abre, seleccione Node.js en el lado izquierdo y cambie el nombre del proyecto de sin título a empleado-api. Finalmente, presione el botón Crear para generar un proyecto.

Para instalar Express en nuestra aplicación, abra una nueva ventana de terminal en Intellij IDEA seleccionando Ver > Ventanas de herramientas > Terminal y use el siguiente comando para instalar Express.

~/WebstormProjects/employee-api$ npm install express

Después de instalar express, cree una carpeta llamada main-app en la carpeta employee-api. Luego, para crear nuestra API, cree un archivo llamado index.js en la carpeta main-app y copie y pegue la siguiente cerca de código en el archivo.

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
    res.json(
        [{
            name: 'Bob',
            email: "bob@gmail.com"
        },
            {
                name: 'Alice',
                email: 'alice@gmail.com'
            },
        ])
})

app.listen(port, () => {
    console.log(`Example app listening on port ${port}`)
})

En este archivo, hemos creado una aplicación rápida que expone el puerto 3000, y cualquier solicitud a la ruta / devuelve una matriz de empleados. Usaremos esta aplicación en todos los ejemplos que cubrimos en las siguientes secciones.

Utilice la instrucción AÑADIR

Cree un archivo llamado Dockerfile en nuestra carpeta base employee-api y copie y pegue el siguiente código en el archivo.

FROM node:16.17.0-alpine
WORKDIR /com/employee
ADD package*.json ./
RUN npm install
ADD main-app /com/employee/main-app
CMD node main-app/index.js

Para crear una imagen personalizada de nuestra aplicación, generalmente usamos un archivo llamado Dockerfile, como se muestra en este ejemplo. La siguiente sección define el significado de cada uno de los comandos utilizados en el archivo. Nuestra preocupación es el comando AÑADIR en la penúltima línea.

Todos los comandos utilizados en el ejemplo de código anterior se explican brevemente a continuación:

  • FROM: el primer comando que se declara en un Dockerfile, y su propósito principal es declarar la imagen base que usaremos para construir nuestra imagen. Tenga en cuenta que la imagen base se extrae de los repositorios públicos.
  • WORKDIR - Establece el directorio de trabajo, y el directorio de trabajo se crea incluso si no lo configuramos en las otras instrucciones.
  • AÑADIR - Copia archivos o carpetas desde el origen al destino. El origen suele ser la máquina host y el destino es el sistema de archivos del contenedor.
  • EJECUTAR: ejecuta el comando proporcionado sobre la imagen existente y devuelve una nueva imagen que contiene los resultados de la ejecución. En este caso, el comando instala las dependencias en la imagen actual. Y la imagen resultante está equipada con las dependencias.
  • CMD: cuando activamos un contenedor, esta instrucción proporciona los valores predeterminados del contenedor, incluidos los ejecutables o una instrucción de punto de entrada. En este caso, hemos utilizado la forma de shell de la instrucción. Además, proporcionamos un ejecutable como predeterminado para nuestro contenedor.

Tenga en cuenta que hemos utilizado la instrucción AÑADIR para copiar el directorio aplicación principal de nuestra máquina host a un nuevo directorio creado en nuestro directorio de trabajo, /com/employee/main-app. Para ver esto en acción, use el siguiente comando para crear una imagen con la etiqueta empleado-api.

~/WebstormProjects/employee-api$ docker build --tag employee-api:latest.

Observe las primeras cinco instrucciones en la consola hasta que la compilación sea exitosa. Luego, asegúrese de que puede ver las instrucciones que se ejecutan como se muestra a continuación.

 => [1/5] FROM docker.io/library/node:16.17.0-alpine@sha256:2c405ed42fc0fd6aacbe5730042640450e5ec030bada7617beac88f742b6997b                         0.0s
 => [internal] load build context                                                                                                                    0.1s
 => => transferring context: 137B                                                                                                                    0.0s
 => CACHED [2/5] WORKDIR /com/employee                                                                                                               0.0s
 => CACHED [3/5] ADD package*.json ./                                                                                                                0.0s
 => CACHED [4/5] RUN npm install                                                                                                                     0.0s
 => CACHED [5/5] ADD main-app /com/employee/main-app  

La última instrucción se ejecuta cuando ejecutamos un contenedor desde nuestra imagen. Por ejemplo, use el siguiente comando para ejecutar un contenedor desde nuestra imagen.

~/WebstormProjects/employee-api$ docker run --name employee-service -d -p 3000:3000 employee-api:latest 

Este comando ejecuta un contenedor llamado empleado-servicio utilizando nuestra imagen empleado-api en modo separado -d y asigna el puerto -p 3000 al puerto 3000 en el localhost.

Para verificar si nuestra aplicación funciona como se espera, vaya a localhost:3000 (http://localhost:3000/) para obtener los datos de los empleados. La siguiente es la matriz JSON devuelta por la solicitud.

[
    {
    "name": "Bob",
    "email": "bob@gmail.com"
    },
    {
    "name": "Alice",
    "email": "alice@gmail.com"
    }
]

Utilice la Instrucción COPY

Comente las instrucciones en el archivo llamado Dockerfile y copie y pegue el siguiente código en el archivo después del comentario.

FROM node:16.17.0-alpine
WORKDIR /com/employee
ADD package*.json ./
RUN npm install
COPY main-app /com/employee/main-app
CMD node main-app/index.js

Tenga en cuenta que estas instrucciones son las mismas que las del ejemplo anterior. El único cambio que hemos hecho es reemplazar la instrucción ADD en la penúltima línea con la instrucción COPY.

COPY: copia archivos o carpetas del origen al destino. El origen suele ser la máquina host y el destino es el sistema de archivos del contenedor.

Tenga en cuenta que la instrucción COPIAR es similar a la instrucción AÑADIR, ya que logran el mismo objetivo. Para ver esto en acción, use los comandos que usamos en el ejemplo anterior para crear una imagen y ejecutar un contenedor desde la imagen.

Podemos crear una nueva imagen o recrear la imagen existente. Para recrear la imagen existente, debemos detener el contenedor en ejecución, eliminar el contenedor y eliminar la imagen. Use los siguientes comandos para ejecutar los pasos respectivamente.

~/WebstormProjects/employee-api$ docker stop employee-service 
~/WebstormProjects/employee-api$ docker rm -f employee-service 
~/WebstormProjects/employee-api$ docker rmi -f employee-api:latest 

Utilice una alternativa a la instrucción ADD

Comente las instrucciones en el archivo llamado Dockerfile y copie y pegue el siguiente código en el archivo después del comentario.

FROM node:16.17.0-alpine
WORKDIR /com/employee
ADD package*.json ./
RUN npm install
ADD . .
CMD node main-app/index.js

Tenga en cuenta que este ejemplo es similar al ejemplo anterior, y el único cambio que hemos hecho es reemplazar la instrucción COPIAR con la instrucción AÑADIR. La instrucción ADD en este ejemplo usa dos puntos . . para especificar el origen y el destino.

Indica que queremos copiar todo el contenido del directorio actual al directorio de trabajo. Entonces, por ejemplo, con este comando, podemos agregar la carpeta main-app y su contenido al directorio de trabajo /com/employee en nuestra imagen, que es mucho más fácil que los otros ejemplos.

Podemos utilizar el archivo .dockerignore para añadir los archivos y carpetas que no queremos que se añadan a nuestra imagen. Luego, use los comandos que usamos en los ejemplos anteriores para crear una imagen y ejecutar un contenedor desde la imagen.

El resultado sigue siendo el mismo ya que no hemos cambiado ningún código en nuestra aplicación Express.

Entonces, hemos aprendido cómo copiar un directorio desde una máquina host a un sistema de archivos de nuestra imagen. También podemos usar las instrucciones AÑADIR y COPIAR para copiar un directorio a otro.

También podemos usar la instrucción COPY con dos puntos COPY . . y seguirá teniendo el mismo efecto.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub

Artículo relacionado - Docker Directory