Tenho 2 serviços em docker-compose.yml (aqui está um trecho; arquivo gerado principalmente pelo Laravel Sail):
services:
laravel.test:
build:
context: .
dockerfile: ./docker/8.3/Dockerfile
args:
WWWGROUP: '${WWWGROUP}'
image: 'sail-8.3/app'
extra_hosts:
- 'host.docker.internal:host-gateway'
ports:
- '800:80'
- '${VITE_PORT:-5173}:${VITE_PORT:-5173}'
environment:
WWWUSER: '${WWWUSER}'
LARAVEL_SAIL: 1
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- pgsql
pgsql:
image: 'postgres:15'
ports:
- '${FORWARD_DB_PORT:-5432}:5432'
environment:
...
volumes:
- 'sail-pgsql:/var/lib/postgresql/data'
- './docker/pgsql/create-testing-database.sql:/docker-entrypoint-initdb.d/10-create-testing-database.sql'
networks:
- sail
networks:
sail:
driver: bridge
O Dockerfile referenciado aqui contém as seguintes linhas perto do final:
COPY --link . /var/www/html
WORKDIR /var/www/html
RUN php artisan migrate --seed
Infelizmente, a migração termina com o erro:
SQLSTATE[08006] [7] could not translate host name "pgsql" to address: Name or service not known
O serviço laravel.test
depende do pgsql
serviço, então ele sabe sobre ele. Mas o Dockerfile laravel.test
parece ter outro escopo e não consegue ver o serviço pgsql
, certo?
Existe alguma maneira de fazer migração no docker?
Seu
laravel.test
contêiner não parece conseguir acessar opgsql
serviço durante a fase de construção porque a descoberta de serviço do Docker (ou seja, como os contêineres se comunicam por meio de nomes de serviço comopgsql
) só funciona quando os contêineres estão em execução. Obuild
processo em um Dockerfile não tem acesso à rede de serviços em execução definida emdocker-compose.yml
.No seu caso, o comando de migração (
php artisan migrate --seed
) está sendo executado durante a fase de construção no Dockerfile.Minha sugestão é que você execute a migração depois que ambos os contêineres estiverem funcionando.
Você pode seguir uma abordagem como esta:
docker-compose.yml
executar a migração depois que os serviços estiverem ativos:Com essas alterações, o serviço Laravel executará a migração automaticamente na inicialização e continuará a executar o servidor de desenvolvimento.
Uma coisa importante a ser notada a propósito: garanta que seu aplicativo espere o serviço PostgreSQL ficar pronto antes de executar migrações. Você pode usar o mecanismo de repetição integrado do Laravel para conexões de banco de dados ou uma ferramenta como
dockerize
esperar o serviço PostgreSQL antes de executar a migração.