Compose com build de imagem
Até então o processo de build de imagem era realizado a partir do arquivo Dockerfile da aplicação com o comando abaixo:
$ docker build -t marcelodpbarbieri/kube-news:v1 -f Dockerfile
Com o Docker Compose é possível especificar os parâmetros de build de uma imagem.
Antes, baixar o Docker Compose:
~/compose$ docker compose down
[+] Running 4/4
✔ Container compose-nginx-1 Removed 0.5s
✔ Container compose-kubenews-1 Remove... 10.6s
✔ Container compose-postgre-1 Removed 0.5s
✔ Network compose_default Removed 0.7s
Remove a especificação do container nginx do arquivo compose.yaml e ajustar as especificações da rede:
services:
postgre:
image: postgres:13.16
ports:
- 5432:5432
environment:
POSTGRES_PASSWORD: kubenews
POSTGRES_USER: kubenews
POSTGRES_DB: kubenews
volumes:
- postgre-docker-vol:/var/lib/postgresql/data
networks:
- kubenews-net
kubenews:
image: marcelodpbarbieri/kube-news:v2
ports:
- 8080:8080
depends_on:
- postgre
environment:
DB_DATABASE: kubenews
DB_USERNAME: kubenews
DB_PASSWORD: kubenews
DB_HOST: postgre
networks:
- kubenews-net
volumes:
postgre-docker-vol:
networks:
kubenews-net:
driver: bridge
Demais ajustes nos containers, redes e imagens existentes:
~/compose$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
~/compose$ docker network ls
NETWORK ID NAME DRIVER SCOPE
c74601097b60 bridge bridge local
73f2d51a39de host host local
27d39cb6b964 network-externa bridge local
9198ba9fc6fd none null local
~/compose$ docker network rm network-externa
network-externa
~/compose$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
marcelodpbarbieri/kube-news latest 64f4ed27fa87 4 days ago 169MB
marcelodpbarbieri/kube-news v2 64f4ed27fa87 4 days ago 169MB
<none> <none> 9666c57b2654 4 days ago 169MB
marcelodpbarbieri/kube-news v1 522e75b2d4b5 4 days ago 169MB
nginx latest 5ef79149e0ec 3 weeks ago 188MB
postgres 13.16 8434335a9e46 4 weeks ago 419MB
~/compose$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:9666c57b26541bf3af7543a20a72dfe1234ac66592261fd7db9e2dd1f69270c9
Total reclaimed space: 0B
~/compose$ docker image rm marcelodpbarbieri/kube-news:latest
~/compose$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
marcelodpbarbieri/kube-news v2 64f4ed27fa87 4 days ago 169MB
marcelodpbarbieri/kube-news v1 522e75b2d4b5 4 days ago 169MB
nginx latest 5ef79149e0ec 3 weeks ago 188MB
postgres 13.16 8434335a9e46 4 weeks ago 419MB
Build de image
Mover o arquivo compose.yaml para dentro do diretório da aplicação:
~/compose$ mv compose.yaml ../devops-kube-news/
~/compose$ cd ../devops-kube-news/
~/devops-kube-news$ ls
README.md compose.yaml popula-dados.http src
O container kube-news precisa ser especificada para dizer que ela passará pelo processo de construção da imagem:
...
kubenews:
image: marcelodpbarbieri/kube-news
build:
context: ./src
dockerfile: Dockerfile
...
Listar as imagens existentes antes de subir o Docker Compose:
~/devops-kube-news$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
marcelodpbarbieri/kube-news v2 64f4ed27fa87 4 days ago 169MB
marcelodpbarbieri/kube-news v1 522e75b2d4b5 4 days ago 169MB
nginx latest 5ef79149e0ec 3 weeks ago 188MB
postgres 13.16 8434335a9e46 4 weeks ago 419MB
Foi realizado o pulling da imagem kubenews:
~/devops-kube-news$ docker compose up -d
[+] Running 1/1
✔ kubenews Pulled 3.0s
[+] Running 3/3
✔ Network devops-kube-news_kubenews-net Created 0.1s
✔ Container devops-kube-news-postgre-1 Started 0.4s
✔ Container devops-kube-news-kubenews-1 Started 0.7s
Listar as imagens após subir o Docker Compose para demonstrar que a imagem marcelodpbarbieri/kube-news:latest foi baixada:
~/devops-kube-news$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
marcelodpbarbieri/kube-news latest 64f4ed27fa87 4 days ago 169MB
marcelodpbarbieri/kube-news v2 64f4ed27fa87 4 days ago 169MB
marcelodpbarbieri/kube-news v1 522e75b2d4b5 4 days ago 169MB
nginx latest 5ef79149e0ec 3 weeks ago 188MB
postgres 13.16 8434335a9e46 4 weeks ago 419MB
Porém não foi realizado o build da aplicação!
Para isso, faz-se necessário passar a instrução --build para o comando docker compose up -d:
Com isso, a especificação de build inserida no arquivo compose.yaml é considerada, porém é necessária a existente do arquivo Dockerfile da aplicação:
~/devops-kube-news$ docker compose up -d --build
[+] Building 1.7s (12/12) FINISHED docker:default
=> [kubenews internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 163B 0.0s
=> [kubenews internal] load metadata for docker.io/library/node:20.10.0 1.4s
=> [kubenews auth] library/node:pull token for registry-1.docker.io 0.0s
=> [kubenews internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [kubenews 1/5] FROM docker.io/library/node:20.10.0-alpine3.18@sha256 0.0s
=> [kubenews internal] load build context 0.0s
=> => transferring context: 2.99MB 0.0s
=> CACHED [kubenews 2/5] WORKDIR /app 0.0s
=> CACHED [kubenews 3/5] COPY package*.json . 0.0s
=> CACHED [kubenews 4/5] RUN npm install 0.0s
=> [kubenews 5/5] COPY . . 0.1s
=> [kubenews] exporting to image 0.1s
=> => exporting layers 0.1s
=> => writing image sha256:61b1b8d5793416af1fb8a3f831abd445a113e942dd77 0.0s
=> => naming to docker.io/marcelodpbarbieri/kube-news 0.0s
=> [kubenews] resolving provenance for metadata file 0.0s
[+] Running 2/2
✔ Container devops-kube-news-postgre-1 Running 0.0s
✔ Container devops-kube-news-kubenews-1 Started 10.9s
Dockerfile e Docker Compose são complementares
Se o namespace não existir e não for especificada a instrução --build, ele fará o build da aplicação pois a imagem não existe:
~/devops-kube-news$ vim compose.yaml
services:
...
kubenews:
image: teste/kube-news
...
~/devops-kube-news$ docker compose up -d
[+] Running 1/1
! kubenews Warning pull access denied for teste/kub... 2.8s
[+] Building 1.2s (11/11) FINISHED docker:default
=> [kubenews internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 163B 0.0s
=> [kubenews internal] load metadata for docker.io/library/node:20.10.0 1.0s
=> [kubenews internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [kubenews 1/5] FROM docker.io/library/node:20.10.0-alpine3.18@sha256 0.0s
=> [kubenews internal] load build context 0.0s
=> => transferring context: 830B 0.0s
=> CACHED [kubenews 2/5] WORKDIR /app 0.0s
=> CACHED [kubenews 3/5] COPY package*.json . 0.0s
=> CACHED [kubenews 4/5] RUN npm install 0.0s
=> CACHED [kubenews 5/5] COPY . . 0.0s
=> [kubenews] exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:61b1b8d5793416af1fb8a3f831abd445a113e942dd77 0.0s
=> => naming to docker.io/teste/kube-news 0.0s
=> [kubenews] resolving provenance for metadata file 0.0s
[+] Running 2/2
✔ Container devops-kube-news-postgre-1 Running 0.0s
✔ Container devops-kube-news-kubenews-1 Started 11.0s
Outras Opções
Fazer somente o build das imagens:
$ docker compose build
[+] Building 1.1s (11/11) FINISHED docker:default
=> [kubenews internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 163B 0.0s
=> [kubenews internal] load metadata for docker.io/library/node:20.10.0 1.0s
=> [kubenews internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [kubenews 1/5] FROM docker.io/library/node:20.10.0-alpine3.18@sha256 0.0s
=> [kubenews internal] load build context 0.0s
=> => transferring context: 830B 0.0s
=> CACHED [kubenews 2/5] WORKDIR /app 0.0s
=> CACHED [kubenews 3/5] COPY package*.json . 0.0s
=> CACHED [kubenews 4/5] RUN npm install 0.0s
=> CACHED [kubenews 5/5] COPY . . 0.0s
=> [kubenews] exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:61b1b8d5793416af1fb8a3f831abd445a113e942dd77 0.0s
=> => naming to docker.io/marcelodpbarbieri/kube-news:v4 0.0s
=> [kubenews] resolving provenance for metadata file 0.0s
Push da imagem
...
kubenews:
image: marcelodpbarbieri/kube-news:v4
build:
context: ./src
dockerfile: Dockerfile
...
$ docker compose push
Baixar as imagens que fazem parte do projeto
Limpar o ambiente:
~/devops-kube-news$ docker compose down
[+] Running 3/3
✔ Container devops-kube-news-kubenews-1 Removed 10.5s
✔ Container devops-kube-news-postgre-1 Removed 0.5s
✔ Network devops-kube-news_kubenews-net Removed
~/devops-kube-news$ docker image rm -f $(docker image ls -q)
~/devops-kube-news$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
~/devops-kube-news$ docker volume rm -f $(docker volume ls -q)
compose_postgre-docker-vol
devops-kube-news_postgre-docker-vol
volume-externo
~/devops-kube-news$ docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- unused build cache
Are you sure you want to continue? [y/N] y
Deleted build cache objects:
...
Total reclaimed space: 267.7MB
~/devops-kube-news$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
~/devops-kube-news$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
~/devops-kube-news$ docker volume ls
DRIVER VOLUME NAME
~/devops-kube-news$ docker network ls
NETWORK ID NAME DRIVER SCOPE
c74601097b60 bridge bridge local
73f2d51a39de host host local
9198ba9fc6fd none null local
Utilizar uma versão existente no Docker Registry:
...
kubenews:
image: marcelodpbarbieri/kube-news:v2
...
Construir a imagem da aplicação:
~/devops-kube-news$ docker compose build
[+] Building 1.5s (12/12) FINISHED docker:default
=> [kubenews internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 163B 0.0s
=> [kubenews internal] load metadata for docker.io/library/node:20.10.0-alpine 1.4s
=> [kubenews auth] library/node:pull token for registry-1.docker.io 0.0s
=> [kubenews internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [kubenews 1/5] FROM docker.io/library/node:20.10.0-alpine3.18@sha256:32427b 0.0s
=> [kubenews internal] load build context 0.0s
=> => transferring context: 830B 0.0s
=> CACHED [kubenews 2/5] WORKDIR /app 0.0s
=> CACHED [kubenews 3/5] COPY package*.json . 0.0s
=> CACHED [kubenews 4/5] RUN npm install 0.0s
=> CACHED [kubenews 5/5] COPY . . 0.0s
=> [kubenews] exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:157ac0c3edb100e995c900a98bd8dd4021b907964ec992d46c5 0.0s
=> => naming to docker.io/marcelodpbarbieri/kube-news:v2 0.0s
=> [kubenews] resolving provenance for metadata file 0.0s
Baixar as imagens do projeto:
~/devops-kube-news$ docker compose pull
[+] Pulling 24/24
✔ kubenews Pulled 12.0s
✔ c926b61bad3b Already exists 0.0s
✔ b519384a30f5 Already exists 0.0s
✔ 4b45d679ee3e Already exists 0.0s
✔ 095f19a54610 Already exists 0.0s
✔ 76184a868b5e Pull complete 2.2s
✔ f068ed4a70c5 Pull complete 2.2s
✔ 91561f7b6371 Pull complete 7.8s
✔ 1353e9619493 Pull complete 8.0s
✔ postgre Pulled 22.2s
✔ a2318d6c47ec Pull complete 9.8s
✔ f29ecd7d1618 Pull complete 9.8s
✔ 60c9fd6649d4 Pull complete 10.3s
✔ cab8740fdd56 Pull complete 10.5s
✔ 84ea3c162c46 Pull complete 11.4s
✔ 9633ee13b142 Pull complete 11.6s
✔ 0b395dd80892 Pull complete 11.6s
✔ 7d6567b03997 Pull complete 11.7s
✔ da4990b85c70 Pull complete 18.0s
✔ 85d5c9c180d3 Pull complete 18.0s
✔ 4aa58d1adbd9 Pull complete 18.0s
✔ 4129bfcc48c3 Pull complete 18.1s
✔ 21f4381d94e7 Pull complete 18.1s
✔ e833a193ea76 Pull complete 18.1s
Com as imagens baixadas o processo de build é mais rápido:
~/devops-kube-news$ docker compose up -d --build
[+] Building 1.1s (11/11) FINISHED docker:default
=> [kubenews internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 163B 0.0s
=> [kubenews internal] load metadata for docker.io/library/node:20.10.0-alpine 1.0s
=> [kubenews internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [kubenews 1/5] FROM docker.io/library/node:20.10.0-alpine3.18@sha256:32427b 0.0s
=> [kubenews internal] load build context 0.0s
=> => transferring context: 830B 0.0s
=> CACHED [kubenews 2/5] WORKDIR /app 0.0s
=> CACHED [kubenews 3/5] COPY package*.json . 0.0s
=> CACHED [kubenews 4/5] RUN npm install 0.0s
=> CACHED [kubenews 5/5] COPY . . 0.0s
=> [kubenews] exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:157ac0c3edb100e995c900a98bd8dd4021b907964ec992d46c5 0.0s
=> => naming to docker.io/marcelodpbarbieri/kube-news:v2 0.0s
=> [kubenews] resolving provenance for metadata file 0.0s
[+] Running 4/4
✔ Network devops-kube-news_kubenews-net Created 0.2s
✔ Volume "devops-kube-news_postgre-docker-vol" Created 0.0s
✔ Container devops-kube-news-postgre-1 Started 0.5s
✔ Container devops-kube-news-kubenews-1 Started 0.8s
O desenvolvimento fica mais eficiente.
Também existe a opção de hot-reload para as alterações da aplicação.
Last updated