Сконфигурируйте Dockerfile для использования команды impdp при создании контейнера

Я использую образ докера wnameless/oracle-xe-11g для создания нового файла образа. И когда я создаю контейнер из нового образа, я хочу, чтобы команда 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.."]

но не работает и выдает исключение.

Итак, мой вопрос: "Возможно ли это?" Если да, можете ли вы привести пример кода, как этого можно достичь?

Спасибо,

Обновление. Исключением является не создание изображения, а попытка создать из него контейнер.

Так, например, если я включу это в качестве последней строки моего файла 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

3 ответа

Решение

Хорошо, теперь я понял, как это сделать, после долгих экспериментов, прочитав, как cmd работает (наконец) и помощь / входы, предоставленные выше комментарии от других пользователей.

В основном Docker работает только один CMD (из документов). Так что, если я создаю Dockerfile из wnameless/oracle-xe-11g как

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

тогда это по своей сути переопределит CMD Команда описана wnameless/oracle-xe-11gДокерский файл.

Итак, вот шаги, которые нужно сделать, чтобы достичь этого

Шаг 1: скопировать CMD, выполненные из родительского образа (из Dockerfile)

В моем случае это было бы

/usr/sbin/startup.sh

Шаг 2: добавьте свою собственную CMD к вышеуказанной CMD с помощью операции &&.

здесь было бы

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

Обратите внимание, что вам нужно включить весь путь impdp и всю операцию в кавычки

Шаг 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

Вот и все. Это должно работать

Другие вещи, которые следует иметь в виду, особенно при использовании приведенного выше файла ocker dockerfile: вам нужно установить ENV для oracle_home, а также экспортировать его в 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

Создайте простой сценарий оболочки ur_script.sh, который будет запускать команду impdp.

      #!/bin/bash
echo Load DDL and DML
export TIMESTAMP=`date +%a%d%b%Y`
$ORACLE_HOME/bin/impdp system/oracle full=Y directory=data_pump_dir dumpfile=sample_data.dmp logfile=expdp_log_${TIMESTAMP}.log
echo Complete

Добавьте этот сценарий оболочки в /docker-entrypoint-initdb.d/, как указано в исходном образе https://hub.docker.com/r/wnameless/oracle-xe-11g-r2 .

      # Dockerfile
FROM wnameless/oracle-xe-11g-r2
ADD ur_script.sh /docker-entrypoint-initdb.d/

Этот скрипт будет автоматически выполнен при первом запуске контейнера. И ваш дамп БД будет загружен

Я думаю, что вы напутали "умные" цитаты здесь:

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"] 
Другие вопросы по тегам