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网络,才能通过容器名互相访问:
- 创建自定义网络:
docker network create mssql-network - 启动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 - 启动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
相关产品推荐
相关产品推荐

