配置Dockerfile以在创建容器时使用impdp命令

Try*_*arn 2 oracle11g impdp docker dockerfile

我正在使用wnameless/oracle-xe-11g docker镜像来创建新的图像文件.当我从新图像创建容器时,我希望执行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.
Run Code Online (Sandbox Code Playgroud)

现在我通过ssh-ing到容器并运行impdp来手动执行此操作.我试着用它来做

CMD ["impdp", "system/oracle NOLOGFILE=Y DIRECTORY.."]
Run Code Online (Sandbox Code Playgroud)

但不起作用并抛出异常.

所以我的问题是"这可能"吗?如果是,请提供代码示例,了解如何实现这一目标?

谢谢,

更新:异常不是在创建图像时,而是在尝试从中创建容器时.

所以例如,如果我将它包含在我的docker文件的最后一行

CMD [“impdp”, “system/oracle NOLOGFILE=Y DIRECTORY=expdp_dir
DUMPFILE=SAMPLE_MASTER.EXPDP SCHEMAS=c##sample transform=OID:n”] 
Run Code Online (Sandbox Code Playgroud)

然后做一个

docker build -t my/my_oracle .
Run Code Online (Sandbox Code Playgroud)

并运行它

docker run -d -p 49160:22 -p 49161:1521 my/my_oracle
Run Code Online (Sandbox Code Playgroud)

并检查

docker logs <container_id>
Run Code Online (Sandbox Code Playgroud)

我看到

/bin/sh: 1: ["impdp", : not found
Run Code Online (Sandbox Code Playgroud)

Try*_*arn 5

好的,我现在已经想过如何实现它,经过大量的实验,阅读cmd其他用户的上述评论提供的工作(最后)和帮助/输入.

基本上Docker只运行一个CMD(来自文档).所以如果我从wnameless/oracle-xe-11gas 创建一个dockerfile

From wnameless/oracle-xe-11g
...
...
CMD ["impdp", "...."]
Run Code Online (Sandbox Code Playgroud)

那么这将固有地覆盖CMDwnameless/oracle-xe-11gdocker文件描述的命令.

所以这是实现它的步骤

第1步:复制从父图像执行的CMD(来自Dockerfile)

在我的情况下,这将是

/usr/sbin/startup.sh
Run Code Online (Sandbox Code Playgroud)

第2步:使用&&操作将您自己的CMD附加到上面的CMD.

在这里它会

bin/bash  -c "/u01/app/oracle/product/11.2.0/xe/bin/impdp system/oracle NOLOGFILE=Y
Run Code Online (Sandbox Code Playgroud)

请注意,您需要在blockquotes中包含impdp的整个路径和整个操作

步骤3:如果父Dockerfile包含后台运行进程,请确保它进入最后一个

这将是

/usr/sbin/sshd -D
Run Code Online (Sandbox Code Playgroud)

最终输出应该是这样的

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
Run Code Online (Sandbox Code Playgroud)

而已.这应该工作

要记住的其他事项,特别是在使用上面的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
Run Code Online (Sandbox Code Playgroud)