Gitlab CI/CD 管道给出 Dockerfile 错误

Posted

技术标签:

【中文标题】Gitlab CI/CD 管道给出 Dockerfile 错误【英文标题】:Gitlab CI/CD pipeline giving Dockerfile error 【发布时间】:2021-04-17 03:31:06 【问题描述】:

晚上好, 我正在尝试将我的 nodeJS 应用程序部署到我的 Digital Ocean Server 并且它说它找不到我的 Dockerfile。我确实检查了 Dockerfile 没有 .txt 扩展名。任何指导表示赞赏。我在我的 Gitlab 项目中设置了变量。 管道引发以下错误: "$ chmod og= $ID_RSA chmod:无法识别的选项:---BEGIN BusyBox v1.31.1 () 多调用二进制。 用法:chmod [-Rcvf] MODE[,MODE]... 文件... 每个 MODE 是一个或多个字母 ugoa,其中一个 符号 +-= 和一个或多个字母 rwxst -R 递归 -c 列出更改的文件 -v 列出所有文件 -f 隐藏错误”

stages:
  - build
  - publish
  - deploy

variables:
  TAG_LATEST: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:latest
  TAG_COMMIT: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHORT_SHA

build:
  image: node:latest
  stage: build
  script:
    - npm install
    - echo   "ACCOUNT_SID=$ACCOUNT_SID" >> .env
    - echo   "AUTH_TOKEN=$AUTH_TOKEN" >> .env
    - echo   "API_KEY=$API_KEY" >> .env
    - echo   "API_SECRET=$API_SECRET" >> .env
    - echo   "PHONE_NUMBER=$PHONE_NUMBER" >> .env
    - echo    "sengrid_api=$sengrid_api" >> .env

publish:
  image: docker:latest
  stage: publish
  services:
    - docker:dind
  script:
    - docker build . -t $TAG_COMMIT -t $TAG_LATEST 
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker push $TAG_COMMIT
    - docker push $TAG_LATEST

deploy:
  image: alpine:latest
  stage: deploy
  tags:
    - deployment
  script:
    - chmod og= $ID_RSA
    - apk update && apk add openssh-client
    - ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY"
    - ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker pull $TAG_COMMIT"
    - ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker container rm -f my-app || true"
    - ssh -i $ID_RSA -o StrictHostKeyChecking=no $SERVER_USER@$SERVER_IP "docker run -d -p 80:3000 --name my-app $TAG_COMMIT"
  environment:
    name: production
    url: http://167.172.225.124
  only:
    - master

【问题讨论】:

【参考方案1】:

确保您的 ID_RSA 变量是 Type: file

【讨论】:

【参考方案2】:

如果你像我一样关注this tutorial(看起来是这样),看起来教程假设在主分支上运行,受保护。

我在另一个不受保护的分支上运行。所以我必须取消保护所有变量才能在不受保护的分支上工作。作业立即成功。

【讨论】:

是的,受保护的分支也是我环境中的重点。但是,类型为variable 的变量没有任何问题。 谢谢,但我更愿意保护我正在处理的分支。【参考方案3】:
chmod og= $ID_RSA 

对我来说它不起作用,因为我最后复制了没有断线符号的密钥,结果证明这很重要。 尝试了很多解决方案,花了差不多一天才得到这个/。

【讨论】:

【参考方案4】:

首先检查docker build参数顺序是否正确:

代替:

docker build -t $TAG_COMMIT -t $TAG_LATEST .

我会尝试:

docker build . -t $TAG_COMMIT -t $TAG_LATEST

在运行此构建命令时,还要检查您是否在正确的路径中。 并且有一个名为Dockerfile 的文件(docker build 需要的默认名称)。


关于错误:

chmod og= $ID_RSA 
chmod: unrecognized option: ---BEGIN

您需要将chmod 应用于文件,而不是文件内容。 变量ID_RSA 包括密钥本身,而不是密钥文件名。

使用~/.ssh/id_rsa 代替$ID_RSA

【讨论】:

哦,我的兰塔,我放错了 .谢谢。现在我在部署的最后阶段遇到了一个新错误。我会将错误添加到顶部。它坐在 chmod:无法识别的选项:--BEGIN 我添加了它并得到一个错误,它说它无法归档文件或目录,但我会为此提出另一个问题,因为这超出了这个问题的范围。感谢您的所有帮助以及您为回答所花费的时间。我是 Ci/CD 的新手,解释很有帮助。 @augdog97 没问题。我会关注你的下一个问题。 感谢您抽出宝贵时间。我发布了新问题。 "您需要对文件应用 chmod,而不是文件内容。"你说。但就我而言, $ID_RSA 是一个文件。具有文件类型的 CI 变量。

以上是关于Gitlab CI/CD 管道给出 Dockerfile 错误的主要内容,如果未能解决你的问题,请参考以下文章

触发 Gitlab CI/CD 管道以部署存储库的特定部分

为我的 GitLab-Server 上的每个存储库激活 CI/CD 管道

在哪里指定 GitLab ci/cd 管道的存储库凭据?

在 Gitlab CI/CD 管道脚本中使用 shell 变量?

将 GitLab CI CD 管道的 .text 输出发送到工件模块

剪切新版本时如何触发 GitLab CI/CD 管道?