Я пытаюсь создать образ Oracle DB Docker, содержащий некоторые предопределенные данные. Образ должен использоваться в файле docker-compose для автоматического запуска некоторых модульных тестов модуля, подключающегося к БД Oracle.
У меня уже есть подготовленный образ MySQL и SQL Server. Запустив эти серверы баз данных, я предоставляю несколько простых, предопределенных баз данных и таблиц.
С MySQL это работало как чудо, так как изображение уже предоставляет каталог /docker-entrypoint-initdb.d
. Сценарии, которые я COPY
выполняю при запуске, и я в порядке.
С SQL Server все было немного сложнее. Я использую /opt/mssql/bin/sqlservr
для запуска SQL Server при создании образа. Когда SQL Server запущен, сценарий оболочки вызывает /opt/mssql-tools/bin/sqlcmd
для запуска некоторых сценариев, создающих базу данных и таблицы, которые я хочу предоставить. Также хорошо.
С Oracle DB кажется невозможным создать образ, который уже содержит некоторые данные.
Вот что я сейчас пытаюсь:
FROM store/oracle/database-enterprise:12.2.0.1-slim
ENV ORACLE_SYS_USER=sys
ENV ORACLE_SYS_PASSWORD=Oradoc_db1
ENV ORACLE_PDB=ORCLPDB1
ENV ORACLE_DATABASE=test
ENV ORACLE_USER=test
ENV ORACLE_PASSWORD=test
USER root
RUN mkdir -p /usr/local/src/oracle
WORKDIR /usr/local/src/oracle
COPY ./docker/wait-for-it.sh /usr/local/src/oracle
COPY ./docker/oracle/start-import.sh /usr/local/src/oracle
COPY ./docker/oracle/import-data.sh /usr/local/src/oracle
COPY ./docker/oracle/create-database.sql /usr/local/src/oracle
COPY ./docker/oracle/testdata.sql /usr/local/src/oracle
RUN chmod +x /usr/local/src/oracle/wait-for-it.sh
RUN chmod +x /usr/local/src/oracle/prepare-import.sh
RUN chmod +x /usr/local/src/oracle/start-import.sh
RUN chmod +x /usr/local/src/oracle/import-data.sh
RUN chown -R oracle:dba /usr/local/src/oracle
USER oracle
RUN ./start-import.sh
ENTRYPOINT /home/oracle/setup/dockerInit.sh
start-import.sh:
#!/bin/sh
# Start the server. From its source it seems that Oracle prefers bash.
/bin/bash /home/oracle/setup/dockerInit.sh &
./wait-for-it.sh "localhost:1521" -t 300 -- ./import-data.sh
kill %1
wait
import-data.sh:
#!/bin/bash
/u01/app/oracle/product/12.2.0/dbhome_1/bin/sqlplus -s $ORACLE_SYS_USER/$ORACLE_SYS_PASSWORD AS SYSDBA << SQL
@/usr/local/src/oracle/create-database.sql
exit;
SQL
/u01/app/oracle/product/12.2.0/dbhome_1/bin/sqlplus -s $ORACLE_USER/$ORACLE_PASSWORD << SQL
@/usr/local/src/oracle/testdata.sql
exit;
SQL
Я пропускаю два файла SQL здесь. Запуск их внутри простого образа Oracle DB Docker работает нормально. А что касается вызова sqlplus
, я уже пробовал некоторые другие вызовы, такие как sqlplus ... @script.sql
, но ни один не работал.
Чтение сценариев. Я ожидаю, что во время создания образа запускается сервер БД Oracle и после его запуска вызовы sqlplus
создают структуру базы данных, которую я хотел бы иметь. Но вместо этого я получаю либо
- Ошибки TNS, если я включаю хост или SID в строку подключения, или
- Ошибки EOF (ORA-03113) в приведенном выше случае.
Done ! The database is ready for use .
# ===========================================================================
# == Add below entries to your tnsnames.ora to access this database server ==
# ====================== from external host =================================
ORCLCDB=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<ip-address>)(PORT=<port>))
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCLCDB.localdomain)))
ORCLPDB1=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<ip-address>)(PORT=<port>))
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCLPDB1.localdomain)))
#
#ip-address : IP address of the host where the container is running.
#port : Host Port that is mapped to the port 1521 of the container.
#
# The mapped port can be obtained from running "docker port <container-id>"
# ===========================================================================
ORCLPDB1(3):Database Characterset for ORCLPDB1 is WE8DEC
ORCLPDB1(3):Opatch validation is skipped for PDB ORCLPDB1 (con_id=0)
2019-04-15T12:44:22.591697+00:00
ORCLPDB1(3):Opening pdb with no Resource Manager plan active
Pluggable database ORCLPDB1 opened read write
Completed: alter pluggable database ORCLPDB1 open
alter pluggable database all save state
Completed: alter pluggable database all save state
2019-04-15T12:44:22.844748+00:00
ALTER SYSTEM SET encrypt_new_tablespaces='DDL' SCOPE=BOTH;
wait-for-it.sh: localhost:1521 is available after 99 seconds
ERROR:
ORA-03113: end-of-file on communication channel
Process ID: 0
Session ID: 0 Serial number: 0
SP2-0306: Invalid option.
Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM|SYSBACKUP|SYSDG|SYSKM|SYSRAC}] [edition=value]]
where <logon> ::= <username>[/<password>][@<connect_identifier>]
<proxy> ::= <proxyuser>[<username>][/<password>][@<connect_identifier>]
SP2-0306: Invalid option.
Usage: CONN[ECT] [{logon|/|proxy} [AS {SYSDBA|SYSOPER|SYSASM|SYSBACKUP|SYSDG|SYSKM|SYSRAC}] [edition=value]]
where <logon> ::= <username>[/<password>][@<connect_identifier>]
<proxy> ::= <proxyuser>[<username>][/<password>][@<connect_identifier>]
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
ERROR:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3701
Additional information: 1724833639
Было бы замечательно, если бы у кого-то была идея. И да, я собираюсь попытаться запустить тонкое изображение, используя объем. Затем создайте таблицы и используйте полученный том в моей среде docker-compose.