Docker-撰写api和数据库配置
Docker-compose api and database configuration
我在容器中连接 Api 与 MySQL 数据库 运行 时遇到问题。我有 Golang 的 Dockerfile Api:
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/
我通常使用 database/sql:
在应用程序中连接数据库
dsn = "user1:pass@tcp(wpmysql:3306)/wp?parseTime=true"
db, err := sql.Open("mysql", dsn)
我的docker-compose.yml:
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
在与 docker-compose.yml 相同的目录中是文件 .env:
DB_PASSWORD=pass
MYSQL_PORT=3306
MYSQL_USER=user1
MYSQL_PASS=pass
MYSQL_DB=wp
MYSQL_CONTAINER_NAME=wpmysql
来电后表扬:
$ docker-compose up -d db
$ docker-compose build web
我收到错误 ERROR main.go:46: dial tcp: lookup wpmysql on 37.8.214.2:53: no such host
。容器列表如下所示:
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
此外,当我尝试通过 dsn = "user1:pass@tcp(localhost:3306)/wp?parseTime=true"
或 dsn = "root:pass@tcp(localhost:3306)/wp?parseTime=true"
在应用程序中连接时,我收到另一个错误:
dial tcp 127.0.0.1:3306: connect: connection refused
尽管我可以使用 root
和 user1
凭证进入容器 (docker exec -it wpmysql bash -l
) 和 sign in
在您的 docker 文件中您有:
RUN go run ./../cmd/web/
这将尝试在构建过程中构建和 运行 您的可执行文件。网络 fullstack
目前不可用。我认为您可能打算使用:
CMD go run ../cmd/web/
这将在您启动(即 docker-compose up
)容器时将默认命令 运行 设置为 go run ../cmd/web/
。更好的是:
RUN go build ../cmd/web/
CMD ../cmd/web/web
这将在构建容器的过程中构建您的应用程序,然后将生成的可执行文件设置为默认命令。这样做的好处是编译错误在构建镜像时会变得明显(这意味着应用程序不会在每次启动容器时构建)。
我在容器中连接 Api 与 MySQL 数据库 运行 时遇到问题。我有 Golang 的 Dockerfile Api:
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/
我通常使用 database/sql:
在应用程序中连接数据库dsn = "user1:pass@tcp(wpmysql:3306)/wp?parseTime=true"
db, err := sql.Open("mysql", dsn)
我的docker-compose.yml:
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
在与 docker-compose.yml 相同的目录中是文件 .env:
DB_PASSWORD=pass
MYSQL_PORT=3306
MYSQL_USER=user1
MYSQL_PASS=pass
MYSQL_DB=wp
MYSQL_CONTAINER_NAME=wpmysql
来电后表扬:
$ docker-compose up -d db
$ docker-compose build web
我收到错误 ERROR main.go:46: dial tcp: lookup wpmysql on 37.8.214.2:53: no such host
。容器列表如下所示:
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
此外,当我尝试通过 dsn = "user1:pass@tcp(localhost:3306)/wp?parseTime=true"
或 dsn = "root:pass@tcp(localhost:3306)/wp?parseTime=true"
在应用程序中连接时,我收到另一个错误:
dial tcp 127.0.0.1:3306: connect: connection refused
尽管我可以使用 root
和 user1
凭证进入容器 (docker exec -it wpmysql bash -l
) 和 sign in
在您的 docker 文件中您有:
RUN go run ./../cmd/web/
这将尝试在构建过程中构建和 运行 您的可执行文件。网络 fullstack
目前不可用。我认为您可能打算使用:
CMD go run ../cmd/web/
这将在您启动(即 docker-compose up
)容器时将默认命令 运行 设置为 go run ../cmd/web/
。更好的是:
RUN go build ../cmd/web/
CMD ../cmd/web/web
这将在构建容器的过程中构建您的应用程序,然后将生成的可执行文件设置为默认命令。这样做的好处是编译错误在构建镜像时会变得明显(这意味着应用程序不会在每次启动容器时构建)。