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-11gwnameless/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"]