Extends
Reutilização de Configurações de Serviços
Extensão de arquivos
Segregação do arquivo compose.yaml conforme abaixo.
Criação do arquivo kubenews.compose.yaml para as especificações do container kubenews existentes no arquivo compose.yaml:
~/devops-kube-news$ touch kubenews.compose.yaml
~/devops-kube-news$ vim kubenews.compose.yaml
services:
kubenews:
image: marcelodpbarbieri/kube-news:${KUBENEWS_TAG:-latest}
build:
context: ./src
dockerfile: Dockerfile
ports:
- 8080:8080
depends_on:
- postgre
environment:
DB_DATABASE: ${POSTGRES_DB}
DB_USERNAME: ${POSTGRES_USER}
DB_PASSWORD: ${POSTGRES_PASSWORD}
DB_HOST: postgre
networks:
- kubenews-net
No arquivo base faz-se necessário informar o arquivo de extensão o serviço:
services:
postgre:
image: postgres:${POSTGRES_TAG}
ports:
- 5432:5432
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- postgre-docker-vol:/var/lib/postgresql/data
networks:
- kubenews-net
web:
extends:
file: ./kubenews.compose.yaml
service: kubenews
volumes:
postgre-docker-vol:
networks:
kubenews-net:
driver: bridge
Neste caso o serviço foi chamado de web, não precisando necessariamente ser este nome. O importante é a especificação da extensão:
web:
extends:
file: ./kubenews.compose.yaml
service: kubenews
Verificar as configurações para visualizar que as especificações do serviço kubenews foram incluídas no serviço web:
~/devops-kube-news$ docker compose config
name: devops-kube-news
services:
postgre:
environment:
POSTGRES_DB: kubenews
POSTGRES_PASSWORD: kubenews
POSTGRES_USER: kubenews
image: postgres:12.17
networks:
kubenews-net: null
ports:
- mode: ingress
target: 5432
published: "5432"
protocol: tcp
volumes:
- type: volume
source: postgre-docker-vol
target: /var/lib/postgresql/data
volume: {}
web:
build:
context: /home/marcelo/devops-kube-news/src
dockerfile: Dockerfile
depends_on:
postgre:
condition: service_started
required: true
environment:
DB_DATABASE: kubenews
DB_HOST: postgre
DB_PASSWORD: kubenews
DB_USERNAME: kubenews
image: marcelodpbarbieri/kube-news:latest
networks:
kubenews-net: null
ports:
- mode: ingress
target: 8080
published: "8080"
protocol: tcp
networks:
kubenews-net:
name: devops-kube-news_kubenews-net
driver: bridge
volumes:
postgre-docker-vol:
name: devops-kube-news_postgre-docker-vol
Sobrescrever a imagem
A imagem utilizada pelo kubenews pode ser sobrescrita na extensão.
Por exemplo, o arquivo .env define a tag v1 para a imagem:
~/devops-kube-news$ cat .env
POSTGRES_TAG=13.16
POSTGRES_PASSWORD=kubenews
POSTGRES_USER=kubenews
POSTGRES_DB=kubenews
KUBENEWS_TAG=v1
Porém o arquivo compose.yaml pode estender a utilização da v2, por exemplo:
Foi alterada a tag do Postgres para 13.16 pois foi a versão da sua criação que está sendo gerenciado pelo Docker Volume.
Com isso é evitado o erro:
PostgreSQL Database directory appears to contain a database;
Skipping initialization
2024-09-07 14:39:31.395 UTC [1] FATAL: database files are incompatible
with server
2024-09-07 14:39:31.395 UTC [1] DETAIL: The data directory was initialized
by PostgreSQL version 13, which is not compatible with this version 12.17
(Debian 12.17-1.pgdg120+1).
services:
postgre:
image: postgres:${POSTGRES_TAG}
ports:
- 5432:5432
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- postgre-docker-vol:/var/lib/postgresql/data
networks:
- kubenews-net
web:
extends:
file: ./kubenews.compose.yaml
service: kubenews
image: marcelodpbarbieri/kube-news:v2
volumes:
postgre-docker-vol:
networks:
kubenews-net:
driver: bridge
Destaque para:
web:
extends:
file: ./kubenews.compose.yaml
service: kubenews
image: marcelodpbarbieri/kube-news:v2
Verificar as configurações:
~/devops-kube-news$ docker compose config
name: devops-kube-news
services:
postgre:
environment:
POSTGRES_DB: kubenews
POSTGRES_PASSWORD: kubenews
POSTGRES_USER: kubenews
image: postgres:12.17
networks:
kubenews-net: null
ports:
- mode: ingress
target: 5432
published: "5432"
protocol: tcp
volumes:
- type: volume
source: postgre-docker-vol
target: /var/lib/postgresql/data
volume: {}
web:
build:
context: /home/marcelo/devops-kube-news/src
dockerfile: Dockerfile
depends_on:
postgre:
condition: service_started
required: true
environment:
DB_DATABASE: kubenews
DB_HOST: postgre
DB_PASSWORD: kubenews
DB_USERNAME: kubenews
image: marcelodpbarbieri/kube-news:v2
networks:
kubenews-net: null
ports:
- mode: ingress
target: 8080
published: "8080"
protocol: tcp
networks:
kubenews-net:
name: devops-kube-news_kubenews-net
driver: bridge
volumes:
postgre-docker-vol:
name: devops-kube-news_postgre-docker-vol
Destaque para:
image: marcelodpbarbieri/kube-news:v2
Subir o Docker Compose com a instrução --build:
~/devops-kube-news$ docker compose up -d --build
[+] Building 2.0s (12/12) FINISHED docker:default
=> [web internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 163B 0.0s
=> [web internal] load metadata for docker.io/library/node:20.10.0-alpine3 1.8s
=> [web auth] library/node:pull token for registry-1.docker.io 0.0s
=> [web internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [web 1/5] FROM docker.io/library/node:20.10.0-alpine3.18@sha256:32427bc 0.0s
=> [web internal] load build context 0.0s
=> => transferring context: 830B 0.0s
=> CACHED [web 2/5] WORKDIR /app 0.0s
=> CACHED [web 3/5] COPY package*.json . 0.0s
=> CACHED [web 4/5] RUN npm install 0.0s
=> CACHED [web 5/5] COPY . . 0.0s
=> [web] exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:7bc35a3c7cc6ed669aec618531dbeefa43ee985b859bf16 0.0s
=> => naming to docker.io/marcelodpbarbieri/kube-news:v2 0.0s
=> [web] resolving provenance for metadata file 0.0s
WARN[0002] Found orphan containers ([devops-kube-news-kubenews-1]) for this project.
If you removed or renamed this service in your compose file,
you can run this command with the --remove-orphans flag to clean it up.
[+] Running 2/2
✔ Container devops-kube-news-postgre-1 Started 0.5s
✔ Container devops-kube-news-web-1 Started 1.0s
Foi realizada a exportação da imagem kube-new com a tag v2:
=> [web] exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:7bc35a3c7cc6ed669aec618531dbeefa43ee985b859bf16 0.0s
=> => naming to docker.io/marcelodpbarbieri/kube-news:v2 0.0s
A alteração do serviço kubenews para web gerou um container órfão:
WARN[0002] Found orphan containers ([devops-kube-news-kubenews-1]) for this project.
If you removed or renamed this service in your compose file,
you can run this command with the --remove-orphans flag to clean it up.
~/devops-kube-news$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c06e8e4b5bc3 marcelodpbarbieri/kube-news:v2 "docker-entrypoint.s…" 2 minutes ago Exited (1) 2 minutes ago devops-kube-news-web-1
Para resolver isso deve-se inserir a instrução --remove-orphans ao subir o Docker Compose:
~/devops-kube-news$ docker compose up -d --build --remove-orp
hans
[+] Building 1.3s (11/11) FINISHED docker:default
=> [web internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 163B 0.0s
=> [web internal] load metadata for docker.io/library/node:20.10.0-alpine3 1.1s
=> [web internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [web 1/5] FROM docker.io/library/node:20.10.0-alpine3.18@sha256:32427bc 0.0s
=> [web internal] load build context 0.0s
=> => transferring context: 830B 0.0s
=> CACHED [web 2/5] WORKDIR /app 0.0s
=> CACHED [web 3/5] COPY package*.json . 0.0s
=> CACHED [web 4/5] RUN npm install 0.0s
=> CACHED [web 5/5] COPY . . 0.0s
=> [web] exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:7bc35a3c7cc6ed669aec618531dbeefa43ee985b859bf16 0.0s
=> => naming to docker.io/marcelodpbarbieri/kube-news:v2 0.0s
=> [web] resolving provenance for metadata file 0.0s
[+] Running 3/3
✔ Container devops-kube-news-kubenews-1 Removed 0.0s
✔ Container devops-kube-news-postgre-1 Started 0.3s
✔ Container devops-kube-news-web-1 Started 0.9s
~/devops-kube-news$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Last updated