【问题标题】:Can't connect to SQL Server from elixir/phoenix in Docker无法从 Docker 中的 elixir/phoenix 连接到 SQL Server
【发布时间】:2018-01-31 20:35:32
【问题描述】:

我正在尝试将“Phoenix (Elixir)-Application”(打包为 Docker-Container)连接到 microsoft/mssql-server-linux:latest Docker-Container

因此我使用https://hex.pm/packages/mssql_ecto 作为适配器

use Mix.Config

config :my_api, MyApi.Repo,
adapter: MssqlEcto,
database: "dev",
username: "sa",
password: "my_api_password",
hostname: "127.0.0.1",
#odbc_driver: "{SQL Server Native Client 11.0}",
#odbc_driver: "{ODBC Driver 11 for SQL Server}",
#odbc_driver: "{ODBC Driver 13.1 for SQL Server}",
#odbc_driver: "{ODBC Driver 13 for SQL Server}",    # <- Default
#port: "1433" # <- Default

我当前用于在 Docker 中运行 phoenix-Application 的 Dockerfile:

FROM elixir:1.5.2

# install ODBC driver
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get install -y curl apt-transport-https debconf-utils apt-utils
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
RUN apt-get update -y && ACCEPT_EULA=Y apt-get install -y msodbcsql && ACCEPT_EULA=Y apt-get install -y mssql-tools && apt-get install -y unixodbc-dev
RUN apt-get install -y erlang-odbc

我猜问题出在我的 Dockerfile 中,尤其是安装 ODBC 驱动程序的行。当您查看我的 Mix.Config 时,您会发现我尝试了许多“odbc-driver”-strings 的组合 - 其中没有一个有效..

这是 phoenix start 的输出:

** (Mix) The database for MyApi.Repo couldn't be created: %Mssqlex.Error{constraint_violations: [], message: "[unixODBC][Driver Manager]Can't open lib '/opt/microsoft/msodbcsql/lib64/libmsodbcsql-11.0.so.2270.0' : file not found Connection to database failed. | ODBC_CODE 01000 | SQL_SERVER_CODE 0", odbc_code: "01000"}

是否有人拥有可以连接到“microsoft/mssql-server-linux:latest Docker-Container”的有效 Elixir (docker-image)?

非常感谢您的帮助!

顺便说一句...我能够通过 HeidiSQL 从主机连接到“mssql-server-linux 容器”和 Microsoft SQL Server Management Studio 17 => 所以“mssql-server-linux Container”完全没有问题。

设置:

  • 主机操作系统:Windows 10 Pro
  • 适用于 Windows 的 Docker:17.12.0-ce-win47

【问题讨论】:

    标签: docker odbc elixir ecto


    【解决方案1】:

    对于所有为此苦苦挣扎的人:这是我为 Ubuntu 16 工作的 Dockerfile 的相关行:

    RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -y install apt-utils apt-transport-https wget
    RUN echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/mssql-ubuntu-xenial-release/ xenial main" > /etc/apt/sources.list.d/mssqlpreview.list
    RUN apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893
    RUN apt-get -y update
    RUN env ACCEPT_EULA=Y DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
        build-essential \
        cpanminus \
        msodbcsql \
        unixodbc-dev-utf16
    RUN apt-get install unixodbc-dev-utf16
    RUN cd /root && \
        wget https://cpan.metacpan.org/authors/id/M/MJ/MJEVANS/DBD-ODBC-1.56.tar.gz && \
        tar xf DBD-ODBC-1.56.tar.gz && \
        cd /root/DBD-ODBC-1.56      && \
        perl Makefile.PL -u         && \
        cpanm --installdeps .       && \
        make                        && \
        make test                   && \
        make install                && \
        rm -rf /root/DBD-ODBC-1.56.tar.gz /root/DBD-ODBC-1.56
    
    # Set locale
    RUN apt-get install -y locales
    RUN locale-gen en_US.UTF-8
    ENV LANG en_US.UTF-8
    ENV LANGUAGE en_US:en
    ENV LC_ALL en_US.UTF-8
    

    最后几行对于 ODBC-Driver 正常工作很重要。

    odbc_driver: "{ODBC Driver 13 for SQL Server}
    

    用于工作的 MssqlEcto-Configuration!

    @Nolan:当我让它与 Ubuntu 一起工作时,我非常高兴,我立即切换到 Debian(elixir 1.6)——它可以工作。但你必须改变一些部分。这是我为 elixir.1.6 (debian) 工作的 Dockerfile - 如果它适用于 1.6.1,请告诉我

    顺便说一句:当涉及到错误的语言环境配置时,odbc 驱动程序非常糟糕;)

    FROM elixir:1.6
    ENV REFRESHED_AT 29-01-2018
    
    
    # install odbc driver
    RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -y install apt-utils apt-transport-https wget
    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
    RUN apt-get update
    RUN env ACCEPT_EULA=Y DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
         build-essential \
         cpanminus \
         msodbcsql \
         unixodbc-dev
    RUN apt-get install unixodbc-dev
    RUN ACCEPT_EULA=Y apt-get install -y msodbcsql
    RUN ACCEPT_EULA=Y apt-get install -y mssql-tools
    RUN cd /root && \
        wget https://cpan.metacpan.org/authors/id/M/MJ/MJEVANS/DBD-ODBC-1.56.tar.gz && \
        tar xf DBD-ODBC-1.56.tar.gz && \
        cd /root/DBD-ODBC-1.56      && \
        perl Makefile.PL -u         && \
        cpanm --installdeps .       && \
        make                        && \
        make test                   && \
        make install                && \
        rm -rf /root/DBD-ODBC-1.56.tar.gz /root/DBD-ODBC-1.56
    
    # set locale configuration
    RUN apt-get install -y locales
    RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
        dpkg-reconfigure --frontend=noninteractive locales && \
        update-locale LANG=en_US.UTF-8
    ENV LANG en_US.UTF-8
    
    # install hex
    RUN mix local.hex --force
    
    # install rebar
    RUN mix local.rebar --force
    
    # install phoenix
    RUN mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new.ez --force
    
    # install node
    RUN curl -sL https://deb.nodesource.com/setup_8.x -o nodesource_setup.sh
    RUN bash nodesource_setup.sh
    RUN apt-get install nodejs
    

    IDK 如果这是生产就绪(在安全和优化方面) - 当你得到优化版本时请告诉我!干杯

    【讨论】:

    • 自己打这个。介意分享你从 Ubuntu 16.04 到运行 Elixir 的 Dockerfile 片段吗?这不适用于 elixir:1.6.1,可能是因为它基于 Debian 8。谢谢!另外,如果我想部署到 prod 但不想要巨大的图像,是否知道上面的哪些部分实际上解决了问题?
    • 嗨@Nolan,现在看看答案
    • 仅供参考,图像 (Debian) 的大小为 445 MB
    猜你喜欢
    • 1970-01-01
    • 2019-05-29
    • 2016-12-26
    • 2020-10-01
    • 1970-01-01
    • 2020-06-12
    • 2020-11-20
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多