Переведите docker run на подкомпоненты - PullRequest
9 голосов
/ 10 мая 2019

У меня есть команда запуска 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 ]

7 голосов
/ 16 мая 2019

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

docker create zricethezav/gitleaks --name=gitleaks 

--name должно быть перед именем изображения , иначе docker create будет интерпретировать его как КОМАНДА аргумент вместо OPTIONS flag .

 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 as 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 после имени изображения.

2 голосов
/ 21 мая 2019

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

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

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

При этом выдается сообщение об ошибке:

unknown flag: --ssh-key

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

У вас есть два варианта решения этой проблемы:

  1. Append --ssh-key='bucket' --repo "$line" до docker create --name=gitleaks zricethezav/gitleaks

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

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

Опция --rm доступна для dockerсоздать , так что вы должны положить его туда.А также, как упоминалось Mihai , вы должны передавать свои аргументы (--ssh-key и т. Д.) При выполнении docker create:

docker create --rm --name=gitleaks zricethezav/gitleaks --ssh-key='bucket' --repo "$line"
2 голосов
/ 11 мая 2019

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

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

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#docker-usage-examples

...