2 回答
TA贡献1836条经验 获得超4个赞
我认为这段代码有不止一个问题。
问题一: 在你的代码中我没有看到你运行docker-compose up,因此我假设 Postgres 没有运行。
问题二: 在这一行:docker run -d -p 3000:3000 -e POSTGRES_DB_URL='//postgres:password@localhost:5432/my-app?sslmode=disable' --name='app' image/app
您将 Postgres 的主机指向localhost,它在您的本地机器上工作。因为本地主机是您的本地计算机。不过,在您使用时,docker run您并不是在本地机器上运行它,而是在 docker 容器中运行。本地主机指向容器内部。
两者的可能解决方案
由于您已经在使用 docker-compose,我建议您也在那里添加您的测试 Web 服务器。
将您的 docker-compose 文件更改为:
version: "3.9"
services:
webapp:
build: image/app
environment:
POSTGRES_DB_URL='//postgres:password@postgres:5432/my-app?sslmode=disable'
ports:
- "3000:3000"
depends_on:
- "postgres"
postgres:
image: postgres:12.5
user: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: my-app
ports:
- "5432:5432"
volumes:
- data:/var/lib/postgresql/data
- ./initdb:/docker-entrypoint-initdb.d
networks:
default:
driver: bridge
volumes:
data:
driver: local
如果您现在运行docker-compose up,这两种服务都将可用。它应该有效。虽然我不是 github-actions 专家,所以我可能错过了一些东西。至少像这样,你可以像在 CI 中一样在本地运行你的测试,我一直认为这是一个很大的优势。
TA贡献2041条经验 获得超4个赞
您缺少的是在 Github Actions 服务器中设置实际的 Postgres 客户端(这就是找不到 psql 工具的原因)。
将其设置为一个步骤。
- name: Install PostgreSQL client
run: |
apt-get update
apt-get install --yes postgresql-client
除此之外,如果您通过 docker-compose 运行所有内容,您将需要等待 postgres 启动并运行(健康和接受连接)。
考虑以下 docker-compose:
version: '3.1'
services:
api:
build: .
depends_on:
- db
ports:
- 8080:8080
environment:
- RUN_UP_MIGRATION=true
- PSQL_CONN_STRING=postgres://gotstock_user:123@host.docker.internal:5432/gotstockapi?sslmode=disable
command: ./entry
db:
image: postgres:9.5-alpine
restart: always
environment:
- POSTGRES_USER=root
- POSTGRES_PASSWORD=password
ports:
- "5432:5432"
volumes:
- ./db:/docker-entrypoint-initdb.d/
您需要注意几件事。首先,在我们environment的部分中,它是作为环境变量传递的数据库的连接字符串。注意主机是。apiPSQL_CONN_STRING=postgres://gotstock_user:123@host.docker.internal:5432/gotstockapi?sslmode=disablehost.docker.internal
除此之外,我们command: ./entry在 api 部分中有。该entry文件包含以下#!/bin/ash脚本:
#!/bin/ash
NOT_READY=1
while [ $NOT_READY -gt 0 ] # <- loop that waits till postgres is ready to accept connections
do
pg_isready --dbname=gotstockapi --host=host.docker.internal --port=5432 --username=gotstock_user
NOT_READY=$?
sleep 1
done;
./gotstock-api # <- actually executes the build of the api
sleep 10
go test -v ./it # <- executes the integration-tests
最后,为了让 psql 客户端在上面的脚本中工作,api 的 docker 文件如下所示:
# syntax=docker/dockerfile:1
FROM golang:1.19-alpine3.15
RUN apk add build-base
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download && go mod verify
COPY . .
RUN apk add postgresql-client
RUN go build -o gotstock-api
EXPOSE 8080
注意RUN apk add postgresql-client哪个安装了客户端。
快乐黑客!=)
- 2 回答
- 0 关注
- 122 浏览
添加回答
举报