/docker-entrypoint-initdb.d目录中的SQL脚本不会执行

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

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

下面你会发现复制SQL脚本的Dockerfile:

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.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泊坞窗相同的问题,我发现迄今为止的解决方法是循环通过一个绝对path。 直到我们find实际的解释,这可能是非常简单的,这是你可以做的:

  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 

然后build立并运行图像。 它应该已经运行你的脚本。 希望有所帮助。