我有一个使用golang构建的Web服务器。当我在本地测试时,它可以成功运行。
但是,当我为我的Web服务器构建一个docker镜像时,它无法连接到正在运行的Postgres容器。
这是我的docker-compose.yml
:
version: '2'
services:
go:
image: golang:1.7
volumes:
- ./:/server/http
ports:
- "80:8080"
links:
- postgres
- mongodb
- redis
environment:
DEBUG: 'true'
PORT: '8080'
postgres:
image: onjin/alpine-postgres:9.5
restart: unless-stopped
ports:
- "5432:5432"
environment:
LC_ALL: C.UTF-8
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
mongodb:
image: mvertes/alpine-mongo:3.2.3
restart: unless-stopped
ports:
- "27017:27017"
redis:
image: sickp/alpine-redis:3.2.2
restart: unless-stopped
ports:
- "6379:6379"
我的Dockerfile
:
FROM golang:1.7
RUN mkdir -p /home/app
WORKDIR /home/app
COPY . /home/app
RUN make deps && make
ENTRYPOINT ["./bin/api-test"]
EXPOSE 8080
我使用的Postgres连接字符串:
postgresql://user:pass@host/mydb?sslmode=disable
对于主持人,我尝试localhost
并返回以下错误:
dial tcp [::1]:5432: getsockopt: connection refused
尝试postgres
并返回以下内容:
dial tcp 202.71.99.194:5432: getsockopt: connection refused
尝试运行此命令的IP地址返回172.19.0.3
:
docker inspect apitest_postgres_1 | grep IPAddress
其中apitest_postgres_1
是Postgres容器名称。它也返回了这个错误:
dial tcp 172.19.0.3:5432: getsockopt: connection timed out
你能告诉我这里缺少什么吗?我对码头工人缺乏经验,这需要很长时间来研究解决方案。
修改 我使用这个命令运行我的golang docker:
docker run --env-file ./example.env --rm -it -p 8080:8080 api-test
example.env
是包含我的环境变量的文件。
编辑2: 我将连接字符串更改为以下内容:
postgresql://user:pass@postgres:5432?sslmode=disable
它返回以下错误:
dial tcp: lookup postgres on 192.168.65.1:53: no such host
我知道我的mac是这里的问题。我的默认DNS是8.8.8.8
,这应该不是问题。
答案 0 :(得分:2)
看起来你正在拉动图像,而不是建立自己的图像。
而不是target_records =
Repo.one from r in Records, where: r.user_id == ^user_id and is_nil(r.deleted_at)
将其替换为image: golang:1.7
来构建和使用您的build: .
。
此外,您可能需要传递postgres环境变量Dockerfile
,DB_HOST
,DB_USER
等等。您可以实现此目的,但只需创建DB_PASS
文件,然后添加{{ 1}}在你的应用docker.env
文件下:
示例docker.env:
env_file
更正了docker-compose.yml:
docker-compose.yml
答案 1 :(得分:1)
查看此文档:https://docs.docker.com/engine/userguide/networking/default_network/configure-dns/
然后,关于docker-compose文件中的链接,替换" host" by" postgres"你连接字符串:
postgresql://user:pass@postgres/mydb?sslmode=disable
让嵌入式DNS服务器执行映射工作,因为每次重新创建容器时ip地址都可能会更改。
另外,确保postgres允许连接(可能仅限于localhost)
答案 2 :(得分:1)
为了在docker compose中建立与Postgres的连接,您需要在其中替换 localhost 或 127.0.0.1 或 postgres 您的连接字符串以及在docker compose文件中提到的容器的名称。
例如,在您的docker-compose.yaml文件中创建如下数据库:
db:
container_name: composepostgres
image: postgres
environment:
,然后在创建连接字符串的代码中,避免使用127.0.0.1
或localhost
或postgres
,而应使用composepostgres
代替它们。< / p>
如果不这样做,您将遇到dial tcp 127.0.0.1:5432: connect: connection refused
错误。