Отправить аргументы на работу
У меня есть образ докера, который в основном запускает одноразовый скрипт. Этот сценарий принимает 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, как вы написали, происходят две вещи:
URL, имя пользователя и пароль зафиксированы на изображении. Любой, кто может получить изображение, может запустить
docker history
и увидеть их в виде простого текста.Запуск контейнера не принимает никаких аргументов; он просто запускает одну команду с фиксированным набором аргументов.
Тем более, что вы планируете передать эти аргументы во время выполнения, я не стал бы пытаться включить их в изображение. Я бы сократил 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"]