SQL /docker-入口点-initdb.d 目录中的脚本未执行
SQL scripts inside /docker-entrypoint-initdb.d directory are not executed
我已经在基于oraclelinux:7.1 映像(Docker 版本 1.12.5)的 docker 容器中安装了 Oracle 12c。但是有一个小问题。当 运行 目录 /docker-entrypoint-initdb.d 中我的脚本的容器 none 被执行时(它们创建数据库用户、执行授权、设置架构等) .这可能是什么问题?
/docker-entrypoint-initdb.d 及其中所有 SQL 文件的权限设置为 777。我可以使用默认系统用户登录数据库。
下面是Docker文件复制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.sh:
的那部分
for f in /docker-entrypoint-initdb.d/*; do
case "$f" in
*.sh) echo "[IMPORT] [=10=]: running $f"; . "$f" ;;
*.sql) echo "[IMPORT] [=10=]: 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] [=10=]: ignoring $f" ;;
esac
echo
done
我一直在为 MySQL 和 PostgreSQL 码头工人处理同样的问题,目前我发现的解决方法是循环绝对路径。在我们找到可能非常简单的实际解释之前,您可以执行以下操作:
在 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
然后,在docker-entrypoint.sh中,更改
for f in /docker-entrypoint-initdb.d/*; do
to
for f in /usr/local/bin/docker-entrypoint-initdb.d/*; do
然后构建并 运行 图像。它应该有 运行 你的脚本。
希望对您有所帮助。
我已经在基于oraclelinux:7.1 映像(Docker 版本 1.12.5)的 docker 容器中安装了 Oracle 12c。但是有一个小问题。当 运行 目录 /docker-entrypoint-initdb.d 中我的脚本的容器 none 被执行时(它们创建数据库用户、执行授权、设置架构等) .这可能是什么问题?
/docker-entrypoint-initdb.d 及其中所有 SQL 文件的权限设置为 777。我可以使用默认系统用户登录数据库。
下面是Docker文件复制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.sh:
的那部分for f in /docker-entrypoint-initdb.d/*; do
case "$f" in
*.sh) echo "[IMPORT] [=10=]: running $f"; . "$f" ;;
*.sql) echo "[IMPORT] [=10=]: 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] [=10=]: ignoring $f" ;;
esac
echo
done
我一直在为 MySQL 和 PostgreSQL 码头工人处理同样的问题,目前我发现的解决方法是循环绝对路径。在我们找到可能非常简单的实际解释之前,您可以执行以下操作:
在 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
然后,在docker-entrypoint.sh中,更改
for f in /docker-entrypoint-initdb.d/*; do
to
for f in /usr/local/bin/docker-entrypoint-initdb.d/*; do
然后构建并 运行 图像。它应该有 运行 你的脚本。 希望对您有所帮助。