【问题标题】:SQL scripts inside /docker-entrypoint-initdb.d directory are not executed/docker-entrypoint-initdb.d 目录中的 SQL 脚本未执行
【发布时间】:2017-01-16 16:06:37
【问题描述】:

我已经在基于 oraclelinux:7.1 映像(Docker 版本 1.12.5)的 docker 容器中安装了 Oracle 12c。不过有一个小问题。运行容器时,我在目录 /docker-entrypoint-initdb.d 中的任何脚本都不会被执行(它们创建 DB 用户、执行授权、设置模式等)。这可能是什么问题?

/docker-entrypoint-initdb.d 和其中的所有 SQL 文件的权限设置为 777。我可以使用默认系统用户登录数据库。

您将在下面找到 Dockerfile 复制 SQL 脚本:

FROM oracle-12c:latest

USER oracle
ENV ORACLE_SID ORCL
ENV ORACLE_HOME /u01/app/oracle/product/12.1/db_1
ENV PATH $PATH:$ORACLE_HOME/bin
USER root

RUN echo $PATH
COPY init-scripts/* /docker-entrypoint-initdb.d/

EXPOSE 1521

我的容器中的日志:

2017-01-13T15:43:09.158097846Z 
**************************
**** Starting up...   ****
**************************
2017-01-13T15:43:09.158142165Z 
/home/oracle/.bashrc: line 12: /usr/sbin/groupadd: Permission denied
2017-01-13T15:43:09.308941164Z 
LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 13-JAN-2017 15:43:09
2017-01-13T15:43:09.308978154Z 
Copyright (c) 1991, 2014, Oracle.  All rights reserved.
2017-01-13T15:43:09.308987178Z 
Starting /u01/app/oracle/product/12.1/db_1/bin/tnslsnr: please wait...
2017-01-13T15:43:09.314168904Z 
TNSLSNR for Linux: Version 12.1.0.2.0 - Production
Log messages written to /u01/app/oracle/diag/tnslsnr/5657f8f40e69/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=5657f8f40e69)(PORT=1521)))
2017-01-13T15:43:15.939107815Z 
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.1.0.2.0 - Production
Start Date                13-JAN-2017 15:43:09
Uptime                    0 days 0 hr. 0 min. 6 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Log File         /u01/app/oracle/diag/tnslsnr/5657f8f40e69/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=5657f8f40e69)(PORT=1521)))
The listener supports no services
The command completed successfully
/home/oracle/.bashrc: line 12: /usr/sbin/groupadd: Permission denied
Processing Database instance "ORCL": log file /u01/app/oracle/product/12.1/db_1/startup.log
/home/oracle/.bashrc: line 12: /usr/sbin/groupadd: Permission denied
2017-01-13T15:43:42.583817187Z 
LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 13-JAN-2017 15:43:42
2017-01-13T15:43:42.583862324Z 
Copyright (c) 1991, 2014, Oracle.  All rights reserved.
2017-01-13T15:43:42.583872256Z 
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.1.0.2.0 - Production
Start Date                13-JAN-2017 15:43:09
Uptime                    0 days 0 hr. 0 min. 33 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Log File         /u01/app/oracle/diag/tnslsnr/5657f8f40e69/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=5657f8f40e69)(PORT=1521)))
Services Summary...
Service "ORCL" has 1 instance(s).
  Instance "ORCL", status READY, has 1 handler(s) for this service...
The command completed successfully
2017-01-13T15:43:42.609310535Z 
**************************
**** Startup finished ****
**************************
2017-01-13T15:43:42.609351046Z 

【问题讨论】:

  • 我可能在这里遗漏了一些明显的东西,但是:为什么要首先执行/docker-entrypoint-initdb.d/ 中的脚本/您希望执行哪个进程?码头工人? Oracle DB 启动脚本?你的登录外壳?
  • @FrankSchmitt:这不是默认行为吗?带有 Oracle 11g 的容器执行了这些脚本。 Oracle 12c 映像基于 Oracle 11g 映像的 Dockerfile。我可能错过了一些东西,但我不知道是什么。

标签: oracle docker oracle12c


【解决方案1】:

我假设你说的是 docker-entrypoint.sh 的那部分:

for f in /docker-entrypoint-initdb.d/*; do
    case "$f" in
        *.sh)     echo "[IMPORT] $0: running $f"; . "$f" ;;
        *.sql)    echo "[IMPORT] $0: running $f"; echo "exit" | su oracle -c "NLS_LANG=.$CHARACTER_SET /u01/app/oracle/product/12.1.0/xe/bin/sqlplus -S / as sysdba @$f"; echo ;;
        *)        echo "[IMPORT] $0: ignoring $f" ;;
    esac
    echo
done

我一直在为 MySQL 和 PostgreSQL docker 处理同样的问题,到目前为止我发现的解决方法是遍历绝对路径。在我们找到可能非常简单的实际解释之前,您可以这样做:

  1. 在 Dockerfile 中,执行如下操作:

    # docker-entrypoint.sh
    COPY docker-entrypoint.sh /usr/local/bin/
    RUN chmod +x /usr/local/bin/docker-entrypoint.sh
    
    # Database scripts
    COPY init-scripts/ /usr/local/bin/docker-entrypoint-initdb.d/
    RUN chmod -R +x /usr/local/bin/docker-entrypoint-initdb.d
    
  2. 然后,在 docker-entrypoint.sh 中,更改

    for f in /docker-entrypoint-initdb.d/*; do
to

    for f in /usr/local/bin/docker-entrypoint-initdb.d/*; do

然后构建并运行映像。它应该已经运行了你的脚本。 希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    相关资源
    最近更新 更多