我在 docker-compose.yml 中有 2 个服务(这里是摘录;文件大部分由 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
此处引用的 Dockerfile 在结尾附近包含以下几行:
COPY --link . /var/www/html
WORKDIR /var/www/html
RUN php artisan migrate --seed
不幸的是,迁移以错误结束:
SQLSTATE[08006] [7] could not translate host name "pgsql" to address: Name or service not known
服务laravel.test
依赖于pgsql
服务,因此它知道服务。但是 Dockerfilelaravel.test
似乎有另一个范围并且看不到服务pgsql
,对吗?
docker 中是否存在进行迁移的方法?
您的
laravel.test
容器似乎无法pgsql
在构建阶段访问服务,因为 Docker 的服务发现(即容器如何通过服务名称进行通信,如pgsql
)仅在容器运行时才有效。Dockerfilebuild
中的进程无法访问 中定义的正在运行的服务的网络docker-compose.yml
。在您的情况下,迁移命令(
php artisan migrate --seed
)正在 Dockerfile 的构建阶段执行。我的建议是,在两个容器都启动并运行后执行迁移。
您可以遵循如下方法:
docker-compose.yml
在服务启动后运行迁移:通过这些更改,Laravel 服务将在启动时自动运行迁移,然后继续运行开发服务器。
顺便说一句,需要注意的一件关键事情是: 确保您的应用程序在运行迁移之前等待 PostgreSQL 服务准备就绪。您可以使用 Laravel 的内置数据库连接重试机制,也可以使用类似这样的工具
dockerize
在运行迁移之前等待 PostgreSQL 服务。