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