Отправить аргументы на работу - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть образ докера, который в основном запускает одноразовый скрипт.Это сценарии принимает 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 ]

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

В 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"]
0 голосов
/ 25 ноября 2018

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

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