Переведите 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
в уже существующий контейнер.
У вас есть две альтернативы, чтобы преодолеть эту проблему:
присоединять
--ssh-key='bucket' --repo "$line"
вdocker create --name=gitleaks zricethezav/gitleaks
Или, если вам скучно, вы можете попробовать это вместо этого.
как вы можете видеть, я также не смог перевести флаг --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 для доступа к закрытым репозиториям: