¿Cuál es la diferencia entre `docker-compose build` y` docker build`?

83

¿Cuál es la diferencia entre docker-compose buildy docker build?

Supongamos que en una ruta de proyecto acoplada hay un docker-compose.ymlarchivo:

docker-compose build

Y

docker build
Benyamin Jafari
fuente

Respuestas:

106

docker-composese puede considerar una envoltura alrededor de la CLI de la ventana acoplable (de hecho, es otra implementación en Python como se dice en los comentarios ) para ganar tiempo y evitar líneas de 500 caracteres (y también iniciar múltiples contenedores al mismo tiempo). Utiliza un archivo llamado docker-compose.ymlpara recuperar parámetros.

Puede encontrar la referencia para el formato de archivo docker-compose aquí .

Así que básicamente docker-compose buildleerá su docker-compose.yml, buscará todos los servicios que contienen la build:declaración y ejecutará una docker buildpara cada uno.

Cada unobuild: puede especificar un Dockerfile, un contexto y argumentos para pasar a la ventana acoplable.

Para concluir con un docker-compose.ymlarchivo de ejemplo :

version: '3.2'

services:
  database:
    image: mariadb
    restart: always
    volumes:
      - ./.data/sql:/var/lib/mysql

  web:
    build:
      dockerfile: Dockerfile-alpine
      context: ./web
    ports:
      - 8099:80
    depends_on:
      - database 

Al llamar docker-compose build, solo el webobjetivo necesitará crear una imagen. El docker buildcomando se vería así:

docker build -t web_myproject -f Dockerfile-alpine ./web
hugoShaka
fuente
2
¿De dónde viene la etiqueta "web_myproject" o es solo un ejemplo? ¿Puede especificar el nombre de la imagen al compilar con docker-compose?
eyalzba
5
webproviene del nombre del contenedor. myprojectes el nombre de la carpeta en la que se encuentra. Esto evita conflictos si trabaja en dos proyectos que contienen un webcontenedor.
hugoShaka
Por favor, eche un vistazo a stackoverflow.com/questions/33816456/…
hugoShaka
Basado en lo docker-compose.ymlproporcionado anteriormente, webproviene del nombre del servicio.
eigenfield
1
Este también fue mi entendimiento, pero parece que hay algunas diferencias sutiles. Por ejemplo, los valores hash de la capa de archivo se calculan de forma ligeramente diferente entre los dos.
vidstige
9

Básicamente, docker-compose es una mejor manera de usar docker que solo un comando de docker.

Si la pregunta aquí es si el comando de compilación docker-compose construirá un tipo de cosa zip que contenga varias imágenes, que de otra manera se habrían creado por separado con el Dockerfile habitual, entonces la idea es incorrecta.

La compilación de Docker-compose generará imágenes individuales al ingresar a la entrada de servicio individual en docker-compose.yml.

Con las imágenes de la ventana acoplable, comando, también podemos ver todas las imágenes individuales que se guardan.

La verdadera magia está en la ventana acoplable.

Este básicamente creará una red de contenedores interconectados, que pueden comunicarse entre sí con un nombre de contenedor similar a un nombre de host.

Cerveza de jengibre
fuente
5

Añadiendo a la primera respuesta ...

Puede dar el nombre de la imagen y el nombre del contenedor en la definición del servicio.

Por ejemplo, para el servicio llamado 'web' en el siguiente ejemplo de docker-compose, puede dar el nombre de la imagen y el nombre del contenedor explícitamente, de modo que Docker no tenga que usar los valores predeterminados.

De lo contrario, el nombre de la imagen que utilizará la ventana acoplable será la concatenación de la carpeta (Directorio) y el nombre del servicio. por ejemplo, myprojectdir_web

Por lo tanto, es mejor poner explícitamente el nombre de la imagen deseada que se generará cuando se ejecute el comando docker build.

por ejemplo, imagen: mywebserviceImage nombre_contenedor: my-webServiceImage-Container

ejemplo de archivo docker-compose.yml:

version: '3.2'
services:
  web:
    build:
      dockerfile: Dockerfile-alpine
      context: ./web
    ports:
      - 8099:80
    image: mywebserviceImage
    container_name: my-webServiceImage-Container
    depends_on:
      - database
shivbits
fuente
Especificar el subdirectorio como valor de build:obliga a tener el nombre de archivo exacto como Dockerfile. Por ejemplo, en build: ./web.So el uso de context:es bueno.
eigenfield
2

Pocas palabras adicionales sobre la diferencia entre docker buildy docker-compose build. Ambos tienen una opción para crear imágenes utilizando una imagen existente como caché de capas.

Lamentablemente, hasta ahora, en este nivel, las imágenes hechas por uno no son compatibles con el otro como caché de capas (los ID no son compatibles ). Sin embargo, docker-compose v1.25.0 (2019-11-18) , introduce una característica experimental COMPOSE_DOCKER_CLI_BUILD para que docker-composeuse el constructor de Docker nativo (por lo tanto, las imágenes creadas por docker buildpueden usarse como caché de capas para docker-compose build)

Pascal H.
fuente