将docker run拆分成子组件

9

我有以下这个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 run,并且在共享文件方面遇到了麻烦,因此尝试让 docker cp 正常工作。


正如您所看到的,我也无法将--rm标志从docker run翻译到3个子命令中,不确定应该放在哪里。 - Alexander Mills
2
我相信当您启动容器时,您会以创建它时的相同配置启动它,并且无法传递参数。所有参数都应传递给create命令。 - Mihai
3个回答

7

您的问题出在第一和第二个命令的语法上。

docker create zricethezav/gitleaks --name=gitleaks 

--name 应该放在镜像名称之前,否则 docker create 会将其解释为 COMMAND 参数而不是 OPTIONS flag

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

我了解您想要使用参数--ssh-key和--repo运行镜像,但是这在docker start命令中是不可能的。如果您想将这些参数传递给由该镜像运行的进程,请在镜像名称后面通过docker createdocker 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 的用法 是:

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

在运行时,应该在IMAGE之前指定OPTIONS标志,而IMAGE之后的所有内容都将被解释为COMMANDARG...

当您正在运行时

docker create zricethezav/gitleaks --name=gitleaks

实际上,您正在将 --name=gitleaks 作为 COMMAND 传递,这将覆盖默认的镜像命令(通常在 Dockerfile 中由 CMD 提供),而您可能希望将其作为 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

如果想同时传递OPTIONSCOMMAND,必须在镜像名称前指定OPTIONS,在镜像名称后指定COMMAND

2
您需要使用 Docker 容器的 ID 而不是名称进行复制。
ID 在创建容器时返回,因此:
ID=$(docker create zricethezav/gitleaks --name=gitleaks)
docker cp /keys/ssh/values ${ID}:/root/.ssh

如果您已经创建了容器,您可以:
ID=$(docker inspect gitleaks --format="{{.ID}}")

但是,@mihai是正确的,我不确定你如何配置容器来启动。
我认为正确的方法是从gitleaks开始构建自己的镜像(Dockerfile),然后添加你的密钥。
文档提供了使用GitHub令牌访问私有存储库的说明:

https://github.com/zricethezav/gitleaks#docker-usage-examples


我愿意打赌你不仅可以使用容器的ID,还可以使用容器的名称,但我还没有检查过。 - Alexander Mills

1
“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用法描述,无法向已经存在的容器传递commandargument。不过,您有两个替代方案来解决这个问题:
  1. --ssh-key='bucket' --repo "$line"添加到docker create --name=gitleaks zricethezav/gitleaks之后

  2. 或者,如果您感到无聊,可以尝试这个

正如您所看到的,我也无法将--rm标志从docker run转换为3个子命令,也不确定该放在哪里。

--rm选项适用于docker create,因此您应该将其放在那里。另外,正如Mihai所提到的,您应该在运行docker create时传递参数(--ssh-key等):

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接