You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境下Elixir/Phoenix无法连接SQL Server的问题求助

解决Docker中Phoenix应用连接MSSQL Linux容器的ODBC驱动问题

我之前踩过几乎一模一样的坑,你的错误提示很明确:驱动管理器找不到指定的ODBC驱动文件,这是因为安装的驱动版本和配置里指定的驱动名称不匹配,加上Docker镜像构建时的一些依赖细节没处理好。下面是我亲测有效的完整配置:

一、修正后的Dockerfile

FROM elixir:1.5.2

# 安装系统依赖和ODBC驱动
ENV DEBIAN_FRONTEND noninteractive

# 更新源并安装基础工具
RUN apt-get update && apt-get install -y --no-install-recommends \
    curl apt-transport-https debconf-utils apt-utils unixodbc-dev erlang-odbc

# 添加微软官方源(适配Debian 8 Jessie)
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/debian/8/prod.list > /etc/apt/sources.list.d/mssql-release.list

# 安装MSODBCSQL和mssql-tools,明确指定版本避免混乱
RUN apt-get update -y && ACCEPT_EULA=Y apt-get install -y --no-install-recommends \
    msodbcsql=13.1.9.2-1 mssql-tools=14.0.6.0-1

# 把mssql-tools加入PATH,方便调试
RUN echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc

# 清理apt缓存减小镜像体积
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

改动说明:

  • 明确指定驱动版本,避免自动更新带来的版本不匹配问题
  • 用--no-install-recommends减少冗余依赖,同时清理缓存压缩镜像大小
  • 确保erlang-odbc和unixodbc-dev正确安装,这是Elixir连接ODBC的核心依赖

二、正确的Phoenix Repo配置

打开对应环境的配置文件(比如config/dev.exs),修改Repo配置如下:

use Mix.Config
config :my_api, MyApi.Repo,
  adapter: MssqlEcto,
  database: "dev",
  username: "sa",
  password: "my_api_password",
  # 重点:用MSSQL容器的名称/服务名,不是127.0.0.1!
  hostname: "mssql-db",
  # 对应安装的13.1版本驱动,名称必须完全匹配
  odbc_driver: "{ODBC Driver 13 for SQL Server}",
  port: 1433

关键注意点:

  • 不能用127.0.0.1作为hostname:Docker容器内的127.0.0.1指向容器自身,而非主机。你需要把MSSQL容器的启动名称(比如mssql-db)作为hostname;如果用Docker Compose,直接写服务名即可。
  • 驱动名称必须和安装版本对应:我们安装的是13.1版本,所以用{ODBC Driver 13 for SQL Server},不要随意修改这个字符串,要和驱动实际注册的名称一致。

三、Docker网络配置验证

确保两个容器处于同一Docker网络,才能通过容器名互相访问:

  1. 创建自定义网络:
    docker network create mssql-network
    
  2. 启动MSSQL容器时加入该网络:
    docker run -d --name mssql-db \
      --network mssql-network \
      -e 'ACCEPT_EULA=Y' \
      -e 'SA_PASSWORD=my_api_password' \
      -p 1433:1433 \
      microsoft/mssql-server-linux:latest
    
  3. 启动Phoenix容器时也加入该网络:
    docker run -d --name my-api \
      --network mssql-network \
      -p 4000:4000 \
      your-phoenix-image:latest
    

四、调试小技巧

如果还是连接失败,可以进入Phoenix容器用sqlcmd测试基础连接:

docker exec -it my-api bash
sqlcmd -S mssql-db -U sa -P my_api_password

如果能成功连接,说明网络和驱动都没问题,问题出在Elixir配置;如果连不上,再检查MSSQL的密码、端口和网络配置。


内容的提问来源于stack exchange,提问作者quax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:51:33