gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:42:01 24 4
gpt4 key购买 nike

我正在使用 wnameless/oracle-xe-11g docker 镜像来创建一个新的镜像文件。当我从新图像创建容器时,我希望执行 impdp 命令。这如何通过 Dockerfile 实现?

这是我的 Docker 文件

文件

# 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.."]

但不起作用并抛出异常。

所以我的问题是“这可能吗”?如果是,您能否提供如何实现这一目标的代码示例?

谢谢,

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

例如,如果我将此作为我的 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 之后,我现在已经想出了如何实现它。作品(最终)以及其他用户的上述评论提供的帮助/输入。

Docker 基本上只运行一个 CMD (来自文档)。因此,如果我从 wnameless/oracle-xe-11g 创建一个 dockerfile作为

From wnameless/oracle-xe-11g
...
...
CMD ["impdp", "...."]

那么这将固有地覆盖 CMD wnameless/oracle-xe-11g 描述的命令的 docker 文件。

所以这里是实现它的步骤

Step 1: copy the CMD's executed from the parent image (from the Dockerfile)



就我而言,那将是
/usr/sbin/startup.sh

Step 2: append your own CMD to the above CMD using && operation.



这将是
bin/bash  -c "/u01/app/oracle/product/11.2.0/xe/bin/impdp system/oracle NOLOGFILE=Y

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

Step 3: If the parent Dockerfile contains a background running process make sure that it goes in the last



这将是
/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

关于docker - 配置Dockerfile在容器创建时使用impdp命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38174998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com