Docker-compose: aplikacja + baza danych

0

Mam problem aby połączyć się z poziomu aplikacji z bazą danych MySQL. Obie usługi są uruchamiane w kontenerach.
Mam napisanego Dockerfile dla aplikacji w Golangu:

FROM golang:latest
 WORKDIR /app
 COPY go.mod go.sum ./
RUN go mod download
 COPY . .
WORKDIR /app/bin
 EXPOSE 8080
 RUN go run ./../cmd/web/

W aplikacji łączę się do bazy danych korzystając z database/sql:

dsn = "user1:pass@tcp(wpmysql:3306)/wp?parseTime=true"
db, err := sql.Open("mysql", dsn)

docker-compose.yml wygląda tak:

version: '3'
services:
  db:
    image: mysql:5.7
    container_name: ${MYSQL_CONTAINER_NAME}
    ports: 
        - 3306:3306
    command: --init-file /usr/src/app/init.sql
    volumes:
        - ./init.sql:/usr/src/app/init.sql
    environment:
        - MYSQL_USER=${MYSQL_USER}
        - MYSQL_PASSWORD=${MYSQL_PASS}
        - MYSQL_DATABASE=${MYSQL_DB}
        - MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
    networks:
        - fullstack
  web:
    container_name: wpapi
    build: .
    ports:
        - 8080:8080
    restart: on-failure
    volumes:
        - .:/usr/src/app/
    depends_on:
        - db
    networks:
        - fullstack

networks:
    fullstack:
        driver: bridge

W tym samym katalogu, co docker-compose.yaml mam plik .env:

DB_PASSWORD=pass
MYSQL_PORT=3306
MYSQL_USER=user1
MYSQL_PASS=pass
MYSQL_DB=wp
MYSQL_CONTAINER_NAME=wpmysql

Powywołaniu komendy docker-compose up dostaję błąd: ERROR main.go:46: dial tcp: lookup wpmysql on 37.8.214.2:53: no such host. Ponadto po wylistowaniu kontenerów poprzez docker ps -a dostaję tylko

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
546fb3d40786        f56454650323        "/bin/sh -c 'go run …"   About a minute ago   Up About a minute   8080/tcp            blissful_hertz

Nie wiem dlaczego nie jest uruchomiony kontener wpmysql. Jeżeli w docker-compose usunę całą część odpowiedzialną za web i zostawię tylko db, wówczas kontener wpmysql uruchamia i lista kontenerów wygląda tak:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
7f6c76cc9c4f        mysql:5.7           "docker-entrypoint.s…"   48 seconds ago      Up 47 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp   wpmysql

PS. Generalnie, jak wykonam polecenia:
$ docker-compose up -d db
$ docker-compose build web
I lista kontenerów wygląda tak:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
9fbaf67df5bf        2778fcda2046        "/bin/sh -c 'go run …"   14 seconds ago      Up 13 seconds       8080/tcp                            mystifying_shannon
7f6c76cc9c4f        mysql:5.7           "docker-entrypoint.s…"   40 minutes ago      Up About a minute   0.0.0.0:3306->3306/tcp, 33060/tcp   wpmysql

To dalej mam ten sam error co poprzednio (dial tcp: lookup wpmysql on 37.8.214.2:53: no such host)

PS2. Jeżli łączę się w ten sposób: dsn = "user1:pass@tcp(localhost:3306)/wp?parseTime=true" lub w ten: dsn = "root:pass@tcp(localhost:3306)/wp?parseTime=true" otrzymuję błąd:
dial tcp 127.0.0.1:3306: connect: connection refused pomimo iż po wejściu do kontenera (docker exec -it wpmysql bash -l) mogę się zalogować zarówno na roota jak i user1

0

Spróbuj taki dsn

dsn = "user1:pass@tcp(db:3306)/wp?parseTime=true"

Dlaczego wystawiasz na zewnątrz port 3306 z kontenera bazy danych? Nie lepiej jeśli tylko aplikacja będzie miała do niego dostęp?

 db:
    image: mysql:5.7
    container_name: ${MYSQL_CONTAINER_NAME}
    ports: 
        - "3306"
   ...
0

Poprawiłem swój Dockerfile i udało się połączyć pomiędzy aplikacją a bazą danych.

FROM golang:latest

WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download

COPY . .

WORKDIR /app/bin

RUN go build ./../cmd/web/
EXPOSE 8080

CMD ./web

Mam natomiast kolejny problem, ponieważ w momencie kiedy wysyłam requset do wpapi z mojego hosta, to nie dochodzi. Tak jakby nie było mostu pomiędzy kontenerem wpapi a moim hostem, pomimo, że w docker-compose dodałem mapowanie 8080:8080. NIe rozumiem...

1 użytkowników online, w tym zalogowanych: 0, gości: 1