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:[email protected]: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:[email protected]: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 關注
- 153 瀏覽
添加回答
舉報