在Docker Compose中没有与MSSQL的连接

huangapple go评论117阅读模式
英文:

No connections to mssql in docker compose

问题

我有两个通过docker-compose运行的容器,我的docker-compose文件如下所示:

  1. version: "3.7"
  2. services:
  3. mssql:
  4. build: ./Db
  5. ports:
  6. - 1433:1433
  7. planning-poker:
  8. build: .
  9. restart: always
  10. env_file:
  11. - env.list
  12. ports:
  13. - 80:8080
  14. depends_on:
  15. - mssql

go-app的Dockerfile如下:

  1. FROM golang:latest
  2. RUN apt-get -y update && \
  3. apt-get install -y net-tools && \
  4. apt-get install -y iputils-ping && \
  5. apt-get install -y telnet
  6. ADD . /go/src/planning-poker
  7. WORKDIR /go/src/planning-poker
  8. RUN go build -o main .
  9. ENTRYPOINT ["./main"]

mssql的Dockerfile如下:

  1. FROM mcr.microsoft.com/mssql/server
  2. ENV ACCEPT_EULA=Y
  3. ENV MSSQL_SA_PASSWORD=Yukon_900
  4. EXPOSE 1433
  5. USER root
  6. RUN mkdir -p /usr/src/app
  7. WORKDIR /usr/src/app
  8. COPY . /usr/src/app
  9. RUN chmod +x ./run-initialization.sh
  10. USER mssql
  11. CMD /bin/bash ./entrypoint.sh

我正在使用数据库初始化脚本:

  1. for i in {1..50};
  2. do
  3. /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P Yukon_900 -d master -i SQL_PlanningPoker.sql
  4. if [ $? -eq 0 ]
  5. then
  6. echo "SQL_PlanningPoker.sql completed"
  7. break
  8. else
  9. echo "not ready yet..."
  10. sleep 1
  11. fi
  12. done

我的entrypoint如下:

  1. ./run-initialization.sh & /opt/mssql/bin/sqlservr

问题是我无论如何都无法从包含golang应用程序的容器连接到mssql,连接是通过主机进行的,我尝试从go-app容器上的localhost 1433、127.0.0.1 1433、0.0.0.0 1433使用telnet连接到mssql,但总是出现连接被重置或telnet无法解析地址的错误。
我的项目链接:https://github.com/philomela/PlanningPoker/tree/master - master分支。
我做错了什么?提前谢谢!

英文:

I have two containers that run via docker-compose, my docker-compose looks like this
version: "3.7"

  1. services:
  2. mssql:
  3. build: ./Db
  4. ports:
  5. - 1433:1433
  6. planning-poker:
  7. build: .
  8. restart: always
  9. env_file:
  10. - env.list
  11. ports:
  12. - 80:8080
  13. depends_on:
  14. - mssql

Dockerfile go-app:

  1. FROM golang:latest
  2. RUN apt-get -y update && \
  3. apt-get install -y net-tools && \
  4. apt-get install -y iputils-ping && \
  5. apt-get install -y telnet
  6. ADD . /go/src/planning-poker
  7. WORKDIR /go/src/planning-poker
  8. RUN go build -o main .
  9. ENTRYPOINT ["./main"]

Dockerfile mssql:

  1. FROM mcr.microsoft.com/mssql/server
  2. ENV ACCEPT_EULA=Y
  3. ENV MSSQL_SA_PASSWORD=Yukon_900
  4. EXPOSE 1433
  5. USER root
  6. RUN mkdir -p /usr/src/app
  7. WORKDIR /usr/src/app
  8. COPY . /usr/src/app
  9. RUN chmod +x ./run-initialization.sh
  10. USER mssql
  11. CMD /bin/bash ./entrypoint.sh

I am using database initialization scripts:

  1. for i in {1..50};
  2. do
  3. /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P Yukon_900 -d master -i SQL_PlanningPoker.sql
  4. if [ $? -eq 0 ]
  5. then
  6. echo "SQL_PlanningPoker.sql completed"
  7. break
  8. else
  9. echo "not ready yet..."
  10. sleep 1
  11. fi
  12. done

So is my entrypoint:

  1. ./run-initialization.sh & /opt/mssql/bin/sqlservr

The problem is that I can’t connect to mssql from the container with the golang application in any way, the connection passes from the host, I tried to connect via telnet to mssql from the go-app container on localhost 1433, 127.0.0.1 1433, 0.0.0.0 1433 but always I get an error that the connection is either reset or telnet cannot resolve the addresses.
MyProject: https://github.com/philomela/PlanningPoker/tree/master - master branch.
What am I doing wrong? thank you in advance!

答案1

得分: 1

尝试添加网络并确保所有服务在同一网络中运行

  1. networks:
  2. my-network:
  3. services:
  4. mssql:
  5. build: ./Db
  6. ports:
  7. - 1433:1433
  8. networks:
  9. - my-network
  10. planning-poker:
  11. build: .
  12. restart: always
  13. env_file:
  14. - env.list
  15. ports:
  16. - 80:8080
  17. depends_on:
  18. - mssql
  19. networks:
  20. - my-network

此外,可以使用一些健康检查来检查服务是否健康,而不仅仅是使用 depends_on,因为Docker可能已经启动,但SQL服务器可能需要一些时间才能启动和运行。

参考链接:https://docs.docker.com/engine/reference/builder/#healthcheck

英文:

try adding network and kepp all services run in same network

  1. networks:
  2. my-network:
  3. services:
  4. mssql:
  5. build: ./Db
  6. ports:
  7. - 1433:1433
  8. networks:
  9. - my-network
  10. planning-poker:
  11. build: .
  12. restart: always
  13. env_file:
  14. - env.list
  15. ports:
  16. - 80:8080
  17. depends_on:
  18. - mssql
  19. networks:
  20. - my-network

Also there is a possibility to check service is healthy with some heath check rather than just depends_on because docker may be up but SQL server would take some time to be up and running

https://docs.docker.com/engine/reference/builder/#healthcheck

答案2

得分: 0

问题已解决,我遭受了几天的困扰,但没有注意到我的应用程序中的端口转发,现在一切都正常工作!

英文:

The issue is resolved, I suffered for several days, but did not pay attention to port forwarding in my application, now everything is working stably!

huangapple
  • 本文由 发表于 2023年2月9日 02:02:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/75389948.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定