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_DB
到RAILS_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”的新目录中。
- 甲骨文instantclient12.2-basiclite-12.2.0.1.0-1.x86_64.rpm
- 甲骨文instantclient12.2-devel的-12.2.0.1.0-1.x86_64.rpm
- 甲骨文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数据库的用户感到满意,但请记住,您可能需要调整一些设置才能使其适用于特定的设置。 希望这是一个好的开始。
- 如何在用于Azure文件存储的Docker Volume Driver中安装子目录
- 在Linux上的Azure Web App上安装自定义Docker jenkins映像会丢失保存的configuration数据
- 如何使用docker-machine和VirtualBox创build具有特定URL的Docker机器?
- 我不能用索尔索引我的数据库。 我总是得到`索引失败。 回滚所有的变化
- 使用gradle-docker-plugin将docker服务器IP设置为环境variables
- 在Windows命令提示符下运行Docker时,“清除”不会清除屏幕
- 在CoreOS中启动一个依赖单元
- 如何在Docker的官方php-fpm-alpine图片上安装XDebug?
- 在Cassandra Docker中启用Thrift
- 如何运行具有特定版本和端口转发的docker映像
- 使用htpasswd在Openshift Origin中出错