Переведите docker run на подкомпоненты

У меня есть эта команда запуска Docker:

docker run --rm --name=gitleaks \
   -v "/keys/ssh/values:/root/.ssh"  \
   zricethezav/gitleaks  \
   --ssh-key='bucket' \
   --repo "$line"

Я перевел это на это:

  docker create zricethezav/gitleaks --name=gitleaks
  docker cp /keys/ssh/values gitleaks:/root/.ssh
  docker start gitleaks  --ssh-key='bucket' --repo "$line"

но это дает мне эту ошибку:

Error: No such container:path: gitleaks:/root
unknown flag: --ssh-key

Кто-нибудь знает, где я ошибся? В конечном итоге я вызываю Docker изнутри работающего контейнера, и у меня возникают проблемы с обменом файлами, поэтому я пытаюсь получить docker cp работать.

3 ответа

Проблема связана с вашим первым и вторым синтаксисом команды.

docker create zricethezav/gitleaks --name=gitleaks 

--name должно быть перед именем изображения, в противном случае docker create будет интерпретировать его как аргумент COMMAND вместо флага OPTIONS.

 docker start gitleaks --ssh-key='bucket' --repo "$line"

Я понимаю, что вы хотите запустить изображение с параметрами --ssh-key и --repo, однако это невозможно с docker start команда. Если вы хотите, чтобы эти параметры были переданы процессу, запущенному образом, вы должны передать эти параметры в docker create или же docker run Команда после имени изображения.

Так что вы должны сделать:

# Mind the --name before the image name
docker create --name=gitleaks zricethezav/gitleaks --ssh-key='bucket' --repo "$line"
docker cp /keys/ssh/values gitleaks:/root/.ssh
docker start gitleaks

Пояснения к созданию докера:

docker create использование это:

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

куда OPTIONS флаги должны быть указаны раньше IMAGE и все после IMAGE будет интерпретироваться как COMMAND а также ARG...,

Когда ты бежишь

docker create zricethezav/gitleaks --name=gitleaks

Вы фактически проходите --name=gitleaks как COMMAND которая переопределит команду изображения по умолчанию (ту, которая обычно предоставляется CMD в Dockerfile), где вы, вероятно, хотите передать его как OPTIONS, Например, если вы запустите:

docker create alpine --name=foobar
docker create --name=foobar alpine

docker ps -a вывод будет выглядеть так:

IMAGE        COMMAND              NAMES
alpine       "/bin/sh"            foobar
alpine       "--name=foobar"      quirky_varahamihira

Если вы хотите передать оба OPTIONS а также COMMAND, вы должны указать OPTIONS перед именем изображения и COMMAND после имени изображения.

tl;dr Идеальный перевод был бы

docker create --rm --name=gitleaks zricethezav/gitleaks --ssh-key='bucket' --repo "$line"
docker cp /keys/ssh/values gitleaks:/root/.ssh
docker start gitleaks

(X) 1. docker create zricethezav/gitleaks --name=gitleaks

Ваш перевод не соответствует описанию использования docker create,

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

Итак, вам нужно поменять свой вариант --name=gitleaks с именем изображения:

docker create --name=gitleaks zricethezav/gitleaks

(✓) 2. docker cp /keys/ssh/values gitleaks:/root/.ssh

Это будет выполнено успешно.

(Х) 3. docker start gitleaks --ssh-key='bucket' --repo "$line"

Это выдаст ошибку, говорящую:

unknown flag: --ssh-key

В соответствии с описанием использования docker start, не возможно пройти command ни argument в уже существующий контейнер.

У вас есть две альтернативы, чтобы преодолеть эту проблему:

  1. присоединять --ssh-key='bucket' --repo "$line" в docker create --name=gitleaks zricethezav/gitleaks

  2. Или, если вам скучно, вы можете попробовать это вместо этого.

как вы можете видеть, я также не смог перевести флаг --rm из команды docker run в 3 подкоманды, не уверенный, куда это поместить

--rm Опция доступна для создания Docker, поэтому вы должны положить его туда. А также, как отметил Михай, вы должны передать свои аргументы (--ssh-key и т.д.) во время бега docker create:

docker create --rm --name=gitleaks zricethezav/gitleaks --ssh-key='bucket' --repo "$line"

Вам нужно использовать идентификатор контейнера докера, а не его имя для копии.

Идентификатор возвращается при создании контейнера, поэтому:

ID=$(docker create zricethezav/gitleaks --name=gitleaks)
docker cp /keys/ssh/values ${ID}:/root/.ssh

Если вы уже создали контейнер, вы можете:

ID=$(docker inspect gitleaks --format="{{.ID}}")

Но @mihai правильный, и я не уверен, как вы сможете настроить контейнер для начала.

Я думаю, что правильный подход к этому FROM:gitleaks и создайте свой собственный образ (Dockerfile), который добавляет ваши ключи.

В документации приведено объяснение использования токена GitHub для доступа к закрытым репозиториям:

https://github.com/zricethezav/gitleaks

Другие вопросы по тегам