【问题标题】:Translate docker run into subcomponents将 docker run 翻译成子组件
【发布时间】: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 命令。

标签: docker docker-run gitleaks


【解决方案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 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 usage 是:

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

其中OPTIONS 标志应在IMAGE 之前指定,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 是正确的,我不确定您如何才能开始配置容器。

    我认为正确的方法是 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 createusage 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,无法将commandargument 传递给已经存在的容器。

    你有两种方法可以解决这个问题:

    1. --ssh-key='bucket' --repo "$line" 附加到docker create --name=gitleaks zricethezav/gitleaks

    2. 或者如果你觉得无聊,可以试试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"
    

    【讨论】:

      猜你喜欢
      • 2021-11-22
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 2023-01-10
      • 2015-12-07
      • 2016-10-28
      相关资源
      最近更新 更多