Я подозреваю, что причиной вашего признака является то, что учетная запись, указанная для командной строки enable_MQFunctions
, не имеет пароля во время , которое enable_MQFunctions
пытается запустить. Вы можете доказать это, посмотрев db2diag.log
, чтобы увидеть точное сообщение об ошибке аутентификации, и / или просмотрев запись /etc/passwd
для этой учетной записи непосредственно перед запуском enable_MQFunctions
.
Вы можете развернуть Dockerfile
, чтобы полностью сконфигурировать Db2 для MQ во время docker build
вместо того, чтобы выполнять эти шаги после docker run
или в точках входа. Таким образом, вы несете ответственность за все шаги в Dockerfile, и он будет повторяться без ручного вмешательства после команды docker run
. Это также означает, что ваш встроенный образ предварительно запекается со всей необходимой конфигурацией, которая затем будет постоянной. Чтобы получить желаемый результат, у вас должно быть достаточно навыков работы со сценариями в Dockerfile.
Когда все сделано правильно, enable_MQFunctions будет работать правильно во время docker build
, поэтому, если вы получаете ошибки, это потому, что вы делаете это неправильно.
Я могу успешно настроить базу данных и запустить enable_MQFunctions
все внутри Dockerfile, выполнив следующие действия (из-за установки Db2 без полномочий root), поэтому вся конфигурация уже находится в встроенном образе.
после установки Db2 и до запуска db2 Dockerfile должен
создайте /home/db2inst1/sqllib/userprofile
(который будет запускаться всякий раз, когда учетная запись владельца экземпляра ставится в его db2profile
с .bash_profile
или .profile
), чтобы выполнить следующие действия:
- добавить /opt/mqm/lib64
к LD_LIBRARY_PATH
- export AMT_DATA_PATH=/opt/mqm
- добавьте /opt/mqm/bin
на PATH
chown db2inst1:db2iadm1 /home/db2inst1/sqllib/userprofile
после установки Db2 и до db2start
Dockerfile должен выполнить следующие шаги:
- db2set DB2COMM=TCPIP
- db2set DB2ENVLIST=AMT_DATA_PATH
- db2 -v update dbm cfg using federated yes immediate
установить пароль для учетной записи db2inst1 в Dockerfile
Затем Dockerfile может запустить db2start
, создать базу данных (я называю это sample, вы можете называть ее как угодно) и запустить фрагмент ниже как пользователь db2inst1, чтобы сначала создать необходимые объекты в используемой базе данных. по функциям MQ:
su -db2inst1 -c "( db2 -v connect to sample ; \
db2 -tvf /home/db2inst1/sqllib/cfg/mq/amtsetup.sql; \
db2 -v list tables for schema DB2MQ ; \
exit 0 ) "
Обратите внимание, что вам нужно запустить amtsetup.sql
в подоболочке, как показано, чтобы явно выйти из 0, потому что amtsetup.sql
всегда возвращает ненулевой код выхода, даже если он успешно завершается. Итак, вы хотите, чтобы docker build
продолжалось в этом случае.
Если все вышеперечисленные шаги выполнены успешно и MQ уже успешно установлен, позже в Dockerfile
вы можете запустить enable_MQFunctions
следующим образом:
Я использую ARG INSTANCE_PASSWORD, чтобы указать пароль db2inst1, который может быть получен с внешнего устройства.
su - db2inst1 -c "( . ./.profile ;\
db2start ;\
db2 -v activate database sample ;\
cd /home/db2inst1/sqllib/cfg ; \
/home/db2inst1/sqllib/bin/enable_MQFunctions -echo -force -n sample -u db2inst1 -p $INSTANCE_PASSWORD ; \
db2stop force ; \
exit 0)"