Клиент DB2 в Docker - PullRequest
       1

Клиент DB2 в Docker

0 голосов
/ 13 ноября 2018

У нас есть необходимость создать Docker-контейнер, в котором также установлен клиент db2.Этот контейнер также будет содержать некоторые сценарии оболочки, использующие клиент db2.

Мы берем базовый образ Cent OS и затем добавляем db2 с помощью команды RUN:

COPY  db2rtcl_nr.rsp /db2install/
RUN cd /db2install && curl -o ibm_data_server_runtime_client_linuxx64_v11.1.tar.gz http://public_file_server.com/downloads/appTools/installs/db2/ibm_data_server_runtime_client_linuxx64_v11.1.tar.gz && \
tar -xvf ibm_data_server_runtime_client_linuxx64_v11.1.tar.gz && \
rm -f ibm_data_server_runtime_client_linuxx64_v11.1.tar.gz && \
rtcl/db2setup -u db2rtcl_nr.rsp -f sysreq && \

chown -R 1000:1000 /opt/ibm/db2/V11.1

ENV PATH="$PATH:/opt/ibm/db2/V11.1/bin"

Образ строитсяОК, без ошибок.

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

docker run -it --entrypoint=/bin/bash db2Container

и пытаюсь вызвать CLI db2 с

db2

Я получаю сообщение об ошибке:

DB21018E Произошла системная ошибка.Процессор командной строки не может продолжить обработку.

Что сбивает с толку, так это то, что если я сразу же запускаю оболочку bash и затем запускаю CLI db2, она работает:

bash
db2
(c) Copyright IBM Corporation 1993,2007
Command Line Processor for DB2 Client 11.1.0

You can issue database manager commands and SQL statements from the command
prompt. For example:
db2 => connect to sample
db2 => bind sample.bnd

For general help, type: ?.
For command help, type: ? command, where command can be
the first few keywords of a database manager command. For example:
 ? CATALOG DATABASE for help on the CATALOG DATABASE command
 ? CATALOG          for help on all of the CATALOG commands.

To exit db2 interactive mode, type QUIT at the command prompt. Outside
interactive mode, all commands must be prefixed with 'db2'.
To list the current command option settings, type LIST COMMAND OPTIONS.

For more detailed help, refer to the Online Reference Manual.

db2 =>

Вещи, которые я пытался диагностироватьПроблема:

  1. Когда я впервые захожу в сеанс интерактивной оболочки, я набираю env > /tmp/env1.txt, затем я набираю bash и запускаю env > /tmp/env2.txt Когда я diff файлы, онипрактически идентичны, КРОМЕ для переменной: SHLVL=2, которая, как я знаю, просто указывает на то, что 2-я оболочка является вложенной оболочкой

  2. Когда я 1-ый заход в сеанс интерактивной оболочки, я набираю set > /tmp/set1.txt Затем я набираю bash и запускаю set > /tmp/set2.txt Когда я diff файлы, они практически идентичны, КРОМЕ для переменной SHLVL снова

Почему доступен CLI db2после того, как я bash в контейнере, но не в начальном сеансе, когда я использовал docker run -it?

Мы пытаемся использовать этот контейнер в качестве исполняемого контейнера, в котором есть клиент db2 для подключения к внешнемуБазы данных DB2.Мы НЕ пытаемся запустить базу данных db2 в контейнере.

Я начинаю находить, что у меня может быть проблема с тем, как точка входа определяется в нашем Dockerfile.Используя:

ENTRYPOINT cat /dev/null && /usr/bin/bash

клиент DB2 доступен, когда я запускаю docker run -it ContainerName, без необходимости немедленно набирать bash

НО он не работает, когда я пытаюсь запустить контейнер какисполняемый файл docker run ContainerName

Самое близкое решение, которое я нашел, - это изменение Dockerfile:

ENTRYPOINT []

CMD ["/bin/bash"]

Когда я запускаю контейнер как исполняемый файл docker run ContainerName db2 list command options, он работает, однако, ТЕПЕРЬ, еслиI docker run -it ContainerName У меня не сразу есть команды db2, без ввода bash один раз.Это по-прежнему проблематично, поскольку в этом контейнере будет находиться сценарий оболочки, который должен позволять запускать команды db2

1 Ответ

0 голосов
/ 15 ноября 2018

После еще одного поиска, я нашел эту статью: https://engineeringblog.yelp.com/2016/01/dumb-init-an-init-for-docker.html

Используя их пример Github , я обновил наш Dockerfile:

RUN wget -O /usr/local/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.2/dumb-init_1.2.2_amd64
RUN chmod +x /usr/local/bin/dumb-init

, а также обновил точку входа нашего Dockerfile:

ENTRYPOINT ["/usr/local/bin/dumb-init", "--"]
CMD ["/bin/bash"]

В результате мой фиктивный сценарий оболочки (в котором есть команда db2), который живет внутри контейнера, работает, когда контейнер докера вызывается как исполняемый файл:

docker run myContainer /scripts/dummyDB2connect.sh

И я также могу интерактивно раскрутиться и подключиться к контейнеру для запуска команд db2 без необходимости вводить дополнительную команду bash.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...