Docker组合Rails + Oracle数据库

我正在尝试创build一个docker-compose文件,它将启动一个Rails 3.2.13服务器并将其链接到Oracle数据库。 到目前为止,我一直无法从Rails连接到Oracle数据库。 这是来自Rails的错误

oci8.c:513:in oci8lib_191.so: ORA-12154: TNS:could not resolve the connect identifier specified (OCIError) 

泊坞窗,compose.yml

 version: '3.1' services: app: image: local-rails:0.0.1 build: . ports: - "3000:3000" volumes: - "${PWD}:/usr/src/app" depends_on: - db command: bundle exec rails s -p 3000 -b '0.0.0.0' db: image: wnameless/oracle-xe-11g environment: - ORACLE_ALLOW_REMOTE=true ports: - "49160:22" - "49161:1521" 

我的Dockerfile中的variables

 ENV RAILS_ENV local # Notice the use of "db" service name as the HOST ENV RAILS_DB (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db)(PORT=49161))(CONNECT_DATA=(SID=xe))) # I've also tried setting DATABASE_URL directly w/ no yml config # ENV DATABASE_URL db:49161/xe 

database.yml的

 local: adapter: oracle_enhanced database: <%= RAILS_DB %> username: **** password: **** 

我已经成功地启动了两个服务 – Rails指向已知工作configuration的外部Oracle数据库。 我也可以通过Oracle SQL Developer连接到容器化的Oracle数据库。 问题是让他们互相交谈。

在Docker中使用链接已弃用: https : //docs.docker.com/engine/userguide/networking/default_network/dockerlinks/

在我的项目中,我们在Docker中使用自定义networking,如下所示:

 version: "3" services: app: ... networks: - my_network_name db: ... networks: - my_network_name networks: my_network_name: driver: bridge 

运行容器后,您可以validation连接是否正常工作:

 $ docker-compose exec app bash [root@9939116aec31 /]# ping db PING db (172.18.0.3) 56(84) bytes of data. 64 bytes from nettest_db_1.nettest_my_network_name (172.18.0.3): icmp_seq=1 ttl=64 time=0.078 ms 64 bytes from nettest_db_1.nettest_my_network_name (172.18.0.3): icmp_seq=2 ttl=64 time=0.104 ms ^C --- db ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1002ms 

我能够通过声明envvariablesRAILS_DBRAILS_DB -compose文件environment声明而不是在Dockerfile中声明它来得到这个工作。 下面是我为了让Rails在本地使用Oralce数据库所做的工作。

泊坞窗,compose.yml

 version: '3.1' services: app: image: rails-app:0.0.1 build: . ports: - "3000:3000" volumes: - "${PWD}:/home/app" environment: RAILS_ENV: local # Note the use of "db" as the HOST RAILS_DB: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db)(PORT=1521))(CONNECT_DATA=(SID=xe))) depends_on: - db networks: - network command: bundle exec rails s -p 3000 -b '0.0.0.0' db: image: sath89/oracle-12c ports: - 1521:1521 volumes: - oracle/data:/u01/app/oracle networks: - network environment: - ORACLE_ALLOW_REMOTE=true - WEB_CONSOLE=false - ORACLE_SID=xe 

database.yml的

 local: adapter: oracle_enhanced database: <%= ENV['RAILS_DB'] %> username: user password: pw encodeing: utf8 

Dockerfile

为了使用这个,你必须先从Oracle下载3个文件,然后把它们放到你的项目中一个名为“oracle”的新目录中。

  1. 甲骨文instantclient12.2-basiclite-12.2.0.1.0-1.x86_64.rpm
  2. 甲骨文instantclient12.2-devel的-12.2.0.1.0-1.x86_64.rpm
  3. 甲骨文instantclient12.2-sqlplus中,12.2.0.1.0-1.x86_64.rpm

现在你可以参考他们,如下所示。

 FROM ruby:1.9.3 EXPOSE 3000 RUN apt-get update \ && apt-get install -y --no-install-recommends \ && apt-get install alien -y \ && apt-get install freetds-dev -y \ && apt-get install libaio1 COPY ./oracle /home/oracle # Get these files from http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html RUN alien -i /home/oracle/oracle-instantclient12.2-basiclite-12.2.0.1.0-1.x86_64.rpm \ && alien -i /home/oracle/oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm \ && alien -i /home/oracle/oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm ENV ORACLE_HOME /usr/lib/oracle/12.2/client64 ENV PATH ${ORACLE_HOME}/bin:$PATH ENV LD_LIBRARY_PATH ${ORACLE_HOME}/lib ENV ORACLE_SID=xe WORKDIR /home/app COPY Gemfile* ./ RUN bundle install RUN apt-get clean \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /home/app/tmp/pids/* 

这只会让你开始。 您必须configuration数据库用户,表空间等。请记住运行您的迁移。

虽然这会让任何想要在本地运行Oracle数据库的用户感到满意,但请记住,您可能需要调整一些设置才能使其适用于特定的设置。 希望这是一个好的开始。