configurationDockerfile以在创build容器时使用impdp命令
我使用wnameless / oracle-xe-11g docker镜像来创build一个新的镜像文件。 而当我从新的图像创build一个容器,我希望执行impdp命令。 这怎么能通过Dockerfile来实现?
这是我的Docker文件
Dockerfile
# Base Image FROM wnameless/oracle-xe-11g # Create database_dump folder at / -location RUN mkdir ../database_dumps # Copy the dump file and put it into database_dumps created earlier COPY dump_file ../database_dumps # Give permission to user oracle on oracle folder to create tablespace and related operations RUN chown -R oracle /u01/app/oracle/oradata/XE # RUN the database initial sql.(create tablespace, create user etc) ADD init.sql /docker-entrypoint-initdb.d/ # Here is where I want to call the impdp command. when a container is created from this image.
现在我正在通过ssh进入容器并运行impdp来手动执行此操作。 我试图用它来做
CMD ["impdp", "system/oracle NOLOGFILE=Y DIRECTORY.."]
但不起作用,并抛出exception。
所以我的问题是“这是可能的”? 如果是的话,请提供代码如何实现的例子?
谢谢,
更新:创build图像时,但尝试从它创build一个容器时,exception不是。
所以例如,如果我把它作为我的docker文件的最后一行
CMD [“impdp”, “system/oracle NOLOGFILE=Y DIRECTORY=expdp_dir DUMPFILE=SAMPLE_MASTER.EXPDP SCHEMAS=c##sample transform=OID:n”]
然后做一个
docker build -t my/my_oracle .
并运行它
docker run -d -p 49160:22 -p 49161:1521 my/my_oracle
并检查
docker logs <container_id>
我看到
/bin/sh: 1: ["impdp", : not found
好吧,现在我已经想通过大量的实验了解如何使cmd
工作(最终)以及其他用户上述评论提供的帮助/input。
基本上,Docker只运行一个CMD
(来自文档)。 所以如果我从wnameless/oracle-xe-11g
创build一个dockerfile作为
From wnameless/oracle-xe-11g ... ... CMD ["impdp", "...."]
那么这将本质上覆盖wnameless/oracle-xe-11g
的wnameless/oracle-xe-11g
文件描述的CMD
命令。
所以下面是要实现它的步骤
步骤1:复制从父映像执行的CMD(从Dockerfile)
在我的情况下,将是
/usr/sbin/startup.sh
第二步:使用&&操作将你自己的CMD附加到上面的CMD。
这将是
bin/bash -c "/u01/app/oracle/product/11.2.0/xe/bin/impdp system/oracle NOLOGFILE=Y
请注意,您需要包含impdp的整个path以及blockquotes中的整个操作
步骤3:如果父Dockerfile包含后台运行进程,请确保它在最后一个进程中
这将是
/usr/sbin/sshd -D
最终的输出应该是这样的
CMD /usr/sbin/startup.sh && bin/bash -c "/u01/app/oracle/product/11.2.0/xe/bin/impdp system/oracle NOLOGFILE=Y ..." && /usr/sbin/sshd -D
而已。 这应该工作
其他的事情要记住,特别是当使用上面的oracle dockerfile时,你需要为oracle_home设置ENV并将其导出到bash.bashrc,因为这不是默认情况下完成的。
# Add env variables for oracle_home and related ENV ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe \ ORACLE_SID=XE #Export oracle_home and related RUN echo 'export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe' >> etc/bash.bashrc RUN echo 'export PATH=$ORACLE_HOME/bin:$PATH' >> /etc/bash.bashrc RUN echo 'export ORACLE_SID=XE' >> /etc/bash.bashrc
我想你在这里被“聪明”的引号搞乱了:
CMD [“impdp”, “system/oracle NOLOGFILE=Y DIRECTORY=expdp_dir DUMPFILE=SAMPLE_MASTER.EXPDP SCHEMAS=c##sample transform=OID:n”]
改变(我也分离了每个cli参数):
CMD ["impdp", "system/oracle", "NOLOGFILE=Y", "DIRECTORY=expdp_dir", "DUMPFILE=SAMPLE_MASTER.EXPDP", "SCHEMAS=c##sample", "transform=OID:n"]