Сконфигурируйте 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"]