我已经设置了一个Dockerfile和docker-compose.yml文件,但是不确定它们是否正确,并且无法正确运行。
我的Dockerfile是:
FROM golang:1.14-alpine
RUN mkdir /app
ADD . /app
WORKDIR /app
RUN go get
RUN go run server.go
而我的compose.yml是:
version: "3.5"
services:
elasticsearch:
container_name: "elasticsearch"
image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
ports:
- 9200:9200
gqlgen:
container_name: "gqlgen"
build: ./
restart: "on-failure"
ports:
- "8080:8080"
depends_on:
- elasticsearch
这是我文件夹的根目录:
我试图从根目录运行:docker-compose up
,这是我得到的:
panic: Get "http://127.0.0.1:9200/": dial tcp 127.0.0.1:9200: connect: connection refused
我认为我的设置错误。
更新:
根据建议和在线上阅读的更多内容,我将DOCKERFILE更改为:
FROM golang:1.14-alpine
RUN mkdir /app
ADD . /app
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o server .
CMD ["./server"]
并撰写文件:
version: "3.5"
services:
elasticsearch:
container_name: "elasticsearch"
image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
environment:
- node.name=elasticsearch
- cluster.name=es-docker-cluster
- bootstrap.memory_lock=true
- cluster.initial_master_nodes=elasticsearch
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
ports:
- 9200:9200
golang:
container_name: "golang"
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
restart: unless-stopped
depends_on:
- elasticsearch
它现在可以正确构建。
但是运行docker-compose up
也会出现同样的问题。
panic: Get "http://elasticsearch:9200/": dial tcp 172.18.0.2:9200: connect: connection refused
答案 0 :(得分:1)
您遇到了问题,因为您不正确地处理了Elasticsearch。
内部docker容器127.0.0.1
指的是容器本身,因此您的应用正在尝试查找没有容器的Elasticsearch。
从另一个引用一个Docker容器的正确方法是使用docker容器名称。因此,在您的情况下,它将使用名称:elasticsearch
。
编辑: 您的配置还有另一个问题。 您会错过一些Elasticsearch配置的重要要素。
在这里,您具有针对单个节点Elasticsearch集群的最少配置的代码段。
services:
elasticsearch:
container_name: "elasticsearch"
image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
environment:
- node.name=elasticsearch
- cluster.name=es-docker-cluster
- bootstrap.memory_lock=true
- cluster.initial_master_nodes=elasticsearch
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
ports:
- 9200:9200
我之前写的所有内容仍然有效。修改docker-compose之后,编写您的上一个版本,该版本通过http://elasticsearch:9200
引用Elasticsearch应该可以正常工作。
编辑:
正如@David Maze指出的那样,您的示例中还有第三个问题。
您应该拥有RUN go run server.go
而不是CMD go run server.go
。
当您想在容器内运行应用程序时,您正在做的事情就是在构建过程中运行应用程序。
更传统的方法是构建应用程序,而不是复制源代码,将二进制文件复制到容器并在容器内部运行二进制文件。 在这里,您可以了解以下信息:https://medium.com/travis-on-docker/multi-stage-docker-builds-for-creating-tiny-go-images-e0e1867efe5a
答案 1 :(得分:0)
因此,用elasticsearch替换localhost的上述操作是正确的。 但这仅在您使用docker-compose启动时才会发生。 不要尝试使用elasticearch而不是host从您的IDE中调用elasticsearch。 我建议使elasticsearch的主机可配置,并为本地配置保留localhost,但是您可以在docker-compose文件中覆盖它。
version: "3.5"
services:
elasticsearch:
container_name: "elasticsearch"
image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
environment:
- node.name=elasticsearch
- cluster.name=es-docker-cluster
- bootstrap.memory_lock=true
- cluster.initial_master_nodes=elasticsearch
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
ports:
- 9200:9200
golang:
container_name: "golang"
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
restart: unless-stopped
depends_on:
- elasticsearch
environment:
- ELASTICSEARCH_HOST: elasticsearch
ELASTICSEARCH_HOST是您在项目中使用的变量