Как запустить несколько команд с gosu в работе Kubernetes

Я определяю задание Kubernetes для запуска задачи rake, но застрял в том, как написать команду...

Я новичок в K8s и пытаюсь запустить приложение Rails в K8s. В моем приложении Rails Dockerfile я создал пользователя, скопировал код в /home/abc и установил для этого пользователя rvm и rails, а также указал точку входа и команду:

ENTRYPOINT ["/home/abc/docker-entrypoint.sh"]
CMD bash -l -c "cd /home/abc && rvm use 2.2.10 --default && rake db:migrate && exec /usr/bin/supervisord -c config/supervisord.conf"

В docker-entrypoint.sh последняя команда

exec gosu abc "$@"

Цель состоит в том, чтобы в конце перейти к пользователю abc, а затем запустить миграцию базы данных и запустить сервер через supervisord. Это работает, хотя я не знаю, хорошая это практика или нет...

Теперь я хотел бы запустить еще одну задачу rake для какой-то цели. Во-первых, я попытался запустить его с помощью команды kubectl exec:

kubectl exec my-app-deployment-xxxx -- gosu abc bash -l -c 'cd /home/abc && rvm use 2.2.10 --default && rake app:init:test_task'

Это сработало, но для этого требуется знать идентификатор модуля, который является динамическим. поэтому я попытался создать задание K8s и указать в команде:

containers:
- name: my-app
  image: my-app:v0.2
  command: 
  - "gosu"
  - "abc"
  - "bash -l -c 'cd /home/abc && rvm use 2.2.10 --default && rake app:init:test_task'"

Я ожидаю, что задание может быть успешно завершено, но оно не выполнено, и информация об ошибке, когда kubectl регистрирует job_pod, выглядит так:

ошибка: exec: "bash -l -c 'cd /home/abc && rvm use 2.2.10 --default && rake app:init:test_task'": stat bash -l -c cd /home/abc && rvm use 2.2 .10 --default && rake app:init:test_task': нет такого файла или каталога

Я думаю, это должно быть из-за того, как написать часть «команда» для запуска нескольких команд с госу...

Спасибо за вашу помощь!


person JohnZhang    schedule 24.07.2019    source источник


Ответы (1)


Поскольку gosu принимает имя пользователя и оболочку Bash в качестве аргументов, я бы сказал, что это одна, а не три отдельные команды.

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

containers:
- name: my-app
 image: my-app:v0.2
command: ["/bin/sh", "-c", "gosu username bash -l -c 'cd /home/abc && rvm use 2.2.10 --default && rake app:init:test_task'"]

Обратите внимание, что вам нужно создать новый TTY, чтобы запустить команду как значок entrypoint изображения заменяется при выполнении команд в спецификации контейнера в Kubernetes.

person yyyyahir    schedule 24.07.2019
comment
Большое спасибо! только что вернулся с больничного... Могу я задать наивный вопрос: зачем создавать новый TTY при замене конечной точки? Благодарность! - person JohnZhang; 07.08.2019