¿Cuál es la diferencia entre docker-compose build
y docker build
?
Supongamos que en una ruta de proyecto acoplada hay un docker-compose.yml
archivo:
docker-compose build
Y
docker build
¿Cuál es la diferencia entre docker-compose build
y docker build
?
Supongamos que en una ruta de proyecto acoplada hay un docker-compose.yml
archivo:
docker-compose build
Y
docker build
Respuestas:
docker-compose
se 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.yml
para recuperar parámetros.
Puede encontrar la referencia para el formato de archivo docker-compose aquí .
Así que básicamente docker-compose build
leerá su docker-compose.yml
, buscará todos los servicios que contienen la build:
declaración y ejecutará una docker build
para cada uno.
Cada unobuild:
puede especificar un Dockerfile
, un contexto y argumentos para pasar a la ventana acoplable.
Para concluir con un docker-compose.yml
archivo 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 web
objetivo necesitará crear una imagen. El docker build
comando se vería así:
docker build -t web_myproject -f Dockerfile-alpine ./web
web
proviene del nombre del contenedor. myproject
es el nombre de la carpeta en la que se encuentra. Esto evita conflictos si trabaja en dos proyectos que contienen un web
contenedor.
docker-compose.yml
proporcionado anteriormente, web
proviene del nombre del servicio.
docker-compose build
construirá los servicios en el docker-compose.yml
archivo.
https://docs.docker.com/compose/reference/build/
docker build
construirá la imagen definida por Dockerfile.
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.
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
build:
obliga a tener el nombre de archivo exacto como Dockerfile
. Por ejemplo, en build: ./web
.So el uso de context:
es bueno.
Pocas palabras adicionales sobre la diferencia entre docker build
y docker-compose build
. Ambos tienen una opción para crear imágenes utilizando una imagen existente como caché de capas.
docker build
, la opción es--cache-from <image>
docker-composer
, hay una etiqueta cache_from
en la build
sección.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-compose
use el constructor de Docker nativo (por lo tanto, las imágenes creadas por docker build
pueden usarse como caché de capas para docker-compose build
)