Не пробрасываются порты docker-compose
docker-compose.yml
# docker/docker-compose.yml
version: '3.9'
networks:
database-test:
database-dev:
database-prod:
services:
#Sample
chat-service: &chat-service
ports:
- "3000:3000"
build:
context: .
dockerfile: ./build/dockerfiles/golang/Dockerfile
target: golang
env_file:
- .env
volumes:
- ./:/go/src
chat-database: &chat-database
ports:
- "5433:5432"
image: postgres:14.1
healthcheck:
test: [ "CMD", "pg_isready", "-q", "-d", "${DATABASE_DB}_test", "-U", "${DATABASE_USER}_test" ]
timeout: 45s
interval: 2s
retries: 10
env_file:
- .env
#Test
chat-service-test:
<<: *chat-service
container_name: chat-database-test
environment:
- DATABASE_HOST=chat-database-test
- DATABASE_PORT=${DATABASE_PORT}
- DATABASE_USER=${DATABASE_USER}_test
- DATABASE_PASSWORD=${DATABASE_PASSWORD}_test
- DATABASE_DB=${DATABASE_DB}_test
build:
context: .
dockerfile: ./build/dockerfiles/golang/Dockerfile
target: golang_test
networks:
- database-test
depends_on:
chat-database-test:
condition: service_healthy
chat-database-test:
<<: *chat-database
container_name: chat-database-test
environment:
- POSTGRES_USER=${DATABASE_USER}_test
- POSTGRES_PASSWORD=${DATABASE_PASSWORD}_test
- POSTGRES_DB=${DATABASE_DB}_test
volumes:
- chat-database-test:/var/lib/postgresql/data:delegated
networks:
- database-test
#dev
chat-service-dev:
<<: *chat-service
container_name: chat-database-dev
environment:
- DATABASE_HOST=chat-database-dev
- DATABASE_PORT=${DATABASE_PORT}
- DATABASE_USER=${DATABASE_USER}_dev
- DATABASE_PASSWORD=${DATABASE_PASSWORD}_dev
- DATABASE_DB=${DATABASE_DB}_dev
build:
context: .
dockerfile: ./build/dockerfiles/golang/Dockerfile
target: golang_dev
networks:
- database-dev
depends_on:
chat-database-dev:
condition: service_healthy
chat-database-dev:
<<: *chat-database
container_name: chat-database-dev
environment:
- POSTGRES_USER=${DATABASE_USER}_dev
- POSTGRES_PASSWORD=${DATABASE_PASSWORD}_dev
- POSTGRES_DB=${DATABASE_DB}_dev
volumes:
- chat-database-dev:/var/lib/postgresql/data:delegated
networks:
- database-dev
#prod
chat-service-prod:
<<: *chat-service
container_name: chat-database-prod
environment:
- DATABASE_HOST=chat-database-prod
- DATABASE_PORT=${DATABASE_PORT}
- DATABASE_USER=${DATABASE_USER}_prod
- DATABASE_PASSWORD=${DATABASE_PASSWORD}_prod
- DATABASE_DB=${DATABASE_DB}_prod
build:
context: .
dockerfile: ./build/dockerfiles/golang/Dockerfile
target: golang_prod
networks:
- database-prod
depends_on:
chat-database-prod:
condition: service_healthy
chat-database-prod:
<<: *chat-database
container_name: chat-database-prod
environment:
- POSTGRES_USER=${DATABASE_USER}_prod
- POSTGRES_PASSWORD=${DATABASE_PASSWORD}_prod
- POSTGRES_DB=${DATABASE_DB}_prod
volumes:
- chat-database-prod:/var/lib/postgresql/data:delegated
networks:
- database-prod
volumes:
chat-database-test: { }
chat-database-dev: { }
chat-database-prod: { }
Dockerfile
# ------------------------------------------------------------------------------
# Base image
# ------------------------------------------------------------------------------
FROM golang:1.18-bullseye AS golang
RUN apt-get update && apt-get install git
ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN getent passwd $UID || (groupadd --gid $GID user && useradd --uid $UID --gid user --shell /bin/bash --create-home user)
USER $UID
WORKDIR $GOPATH/src
COPY . $GOPATH/src
ENV GO111MODULE="on" \
GOOS=linux
# ------------------------------------------------------------------------------
# Test image
# ------------------------------------------------------------------------------
FROM golang AS golang_test
WORKDIR $GOPATH/src
ENTRYPOINT go test -v ./...
# ------------------------------------------------------------------------------
# Development image
# ------------------------------------------------------------------------------
FROM golang AS golang_dev
EXPOSE 3000
ENTRYPOINT go run cmd/main.go
# ------------------------------------------------------------------------------
# Build image
# ------------------------------------------------------------------------------
FROM golang AS golang_build
RUN go build -mod=vendor -o $GOPATH/bin/main $GOPATH/src/cmd/main.go
RUN chmod +x $GOPATH/bin/main
# ------------------------------------------------------------------------------
# Production image
# ------------------------------------------------------------------------------
FROM alpine:3.7 as golang_prod
COPY --from=golang_build /go/bin/ ./
EXPOSE 3000
ENTRYPOINT ["./main"]
cmd/main.go
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":3000", nil))
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path)
log.Print("URL.Path5 = %q\n", r.URL.Path)
}
поднимаю
docker-compose run --rm chat-service-dev
делаю запрос
GET http://localhost:3000
Content-Type: application/json
ответ
org.apache.http.conn.HttpHostConnectException: Connect to localhost:3000 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect
ОС: Win 11 Почему?
Ответы (2 шт):
Автор решения: Alexander Pavlov
→ Ссылка
Надо использовать docker-compose up chat-service-dev
А если уж используешь docker-compose run, то надо использовать спец. аргумент, чтобы порты открылись docker-compose run --rm --service-ports chat-service-dev
https://docs.docker.com/compose/reference/run/
--service-ports Run command with the service's ports enabled and mapped to the host.
Автор решения: Дмитрий Орлов
→ Ссылка
Внутри контейнера, чтобы прослушать внешний порт используй IP 0.0.0.0. Должно помочь, пиши если не поможет.
func main() {
http.HandleFunc("/", doX)
if err := http.ListenAndServe("0.0.0.0:3000", nil); err != nil {
panic(err)
}
}