Отправить аргументы на работу

У меня есть образ докера, который в основном запускает одноразовый скрипт. Этот сценарий принимает 3 аргумента. Мой докер файл

FROM <some image>

ARG URL
ARG USER
ARG PASSWORD

RUN apt update && apt install curl -y

COPY register.sh .
RUN chmod u+x register.sh

CMD ["sh", "-c", "./register.sh $URL $USER $PASSWORD"]

Когда я раскручиваю contianer, используя docker run -e URL=someUrl -e USER=someUser -e PASSWORD=somePassword -itd <IMAGE_ID> это прекрасно работает.

Теперь я хочу развернуть это как работу.

Моя основная работа выглядит так:

apiVersion: batch/v1
kind: Job
metadata:
  name: register
spec:
  template:
    spec:
      containers:
      - name: register
        image: registeration:1.0
        args: ["someUrl", "someUser", "somePassword"]
      restartPolicy: Never
  backoffLimit: 4

Но это стручок ошибок на

Error: failed to start container "register": Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"someUrl\": executable file not found in $PATH"

Похоже, он принимает мои аргументы в качестве команд и пытается выполнить их. Это верно? Что я могу сделать, чтобы это исправить?

2 ответа

Решение

В Dockerfile, как вы написали, происходят две вещи:

  1. URL, имя пользователя и пароль зафиксированы на изображении. Любой, кто может получить изображение, может запустить docker history и увидеть их в виде простого текста.

  2. Запуск контейнера не принимает никаких аргументов; он просто запускает одну команду с фиксированным набором аргументов.

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

FROM ubuntu:18.04
RUN apt update \
 && DEBIAN_FRONTEND=noninteractive \
    apt install --assume-yes --no-install-recommends \
      curl
COPY register.sh /usr/bin
RUN chmod u+x /usr/bin/register.sh
ENTRYPOINT ["register.sh"]

Когда вы запускаете его, Kubernetes args: получить в качестве параметров командной строки для точки входа. (Это то же самое, что Docker Compose command: и команда свободной формы в конце равнины docker run Команда.) Если скрипт станет точкой входа в контейнер, ваш YAML в Kubernetes будет работать так, как вы ожидаете.

В общем, я предпочитаю использовать CMD для ENTRYPOINT. (Помимо всего прочего, это облегчает docker run --rm -it ... /bin/sh для отладки вашего образа сборки.) Если вы это сделаете, то Kubernetes args: необходимо указать имя скрипта, на котором он выполняется:

args: ["./register.sh", "someUrl", "someUser", "somePassword"]

Использование:

args: ["sh", "-c", "./register.sh someUrl someUser somePassword"]
Другие вопросы по тегам