2 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個(gè)贊
我認(rèn)為這段代碼有不止一個(gè)問題。
問題一: 在你的代碼中我沒有看到你運(yùn)行docker-compose up,因此我假設(shè) Postgres 沒有運(yùn)行。
問題二: 在這一行:docker run -d -p 3000:3000 -e POSTGRES_DB_URL='//postgres:password@localhost:5432/my-app?sslmode=disable' --name='app' image/app
您將 Postgres 的主機(jī)指向localhost,它在您的本地機(jī)器上工作。因?yàn)楸镜刂鳈C(jī)是您的本地計(jì)算機(jī)。不過,在您使用時(shí),docker run您并不是在本地機(jī)器上運(yùn)行它,而是在 docker 容器中運(yùn)行。本地主機(jī)指向容器內(nèi)部。
兩者的可能解決方案
由于您已經(jīng)在使用 docker-compose,我建議您也在那里添加您的測(cè)試 Web 服務(wù)器。
將您的 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
如果您現(xiàn)在運(yùn)行docker-compose up,這兩種服務(wù)都將可用。它應(yīng)該有效。雖然我不是 github-actions 專家,所以我可能錯(cuò)過了一些東西。至少像這樣,你可以像在 CI 中一樣在本地運(yùn)行你的測(cè)試,我一直認(rèn)為這是一個(gè)很大的優(yōu)勢(shì)。

TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊
您缺少的是在 Github Actions 服務(wù)器中設(shè)置實(shí)際的 Postgres 客戶端(這就是找不到 psql 工具的原因)。
將其設(shè)置為一個(gè)步驟。
- name: Install PostgreSQL client
run: |
apt-get update
apt-get install --yes postgresql-client
除此之外,如果您通過 docker-compose 運(yùn)行所有內(nèi)容,您將需要等待 postgres 啟動(dòng)并運(yùn)行(健康和接受連接)。
考慮以下 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的部分中,它是作為環(huán)境變量傳遞的數(shù)據(jù)庫(kù)的連接字符串。注意主機(jī)是。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哪個(gè)安裝了客戶端。
快樂黑客!=)
- 2 回答
- 0 關(guān)注
- 148 瀏覽
添加回答
舉報(bào)