将 docker run 翻译成子组件
Posted
技术标签:
【中文标题】将 docker run 翻译成子组件【英文标题】:Translate docker run into subcomponents 【发布时间】:2019-09-28 18:25:08 【问题描述】:我有这个 docker run 命令:
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
工作。
【问题讨论】:
如您所见,我也未能将 docker run 中的--rm
标志转换为 3 个子命令,不知道该放在哪里
我确实相信,当您启动一个容器时,您会以您创建它的相同配置启动它,并且您不能向它传递参数。应将所有参数传递给 create 命令。
【参考方案1】:
问题在于您的第一个和第二个命令语法。
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
usage 是:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
其中OPTIONS
标志应在IMAGE
之前指定,IMAGE
之后的所有内容将被解释为COMMAND
和ARG...
。
当你跑步时
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
如果要同时传递OPTIONS
和COMMAND
,则必须在图像名称前指定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 是正确的,我不确定您如何才能开始配置容器。
我认为正确的方法是 FROM:gitleaks
并构建您自己的映像(Dockerfile)来添加您的密钥。
文档提供了使用 GitHub 令牌访问私有存储库的说明:
https://github.com/zricethezav/gitleaks#docker-usage-examples
【讨论】:
我敢打赌,你可以使用容器名称,而不仅仅是 id,但我没有检查【参考方案3】: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
的usage description 不匹配。
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
中的to usage description,无法将command
或argument
传递给已经存在的容器。
你有两种方法可以解决这个问题:
将--ssh-key='bucket' --repo "$line"
附加到docker create --name=gitleaks zricethezav/gitleaks
或者如果你觉得无聊,可以试试this。
如您所见,我也未能将 --rm 标志从 docker run 转换为 3 个子命令,不知道该放在哪里
--rm
选项可用于docker create,所以你应该把它放在那里。而且,正如 Mihai 提到的,您应该在运行 docker create
时传递您的参数(--ssh-key
等):
docker create --rm --name=gitleaks zricethezav/gitleaks --ssh-key='bucket' --repo "$line"
【讨论】:
以上是关于将 docker run 翻译成子组件的主要内容,如果未能解决你的问题,请参考以下文章