【问题标题】:copy file to docker container from inside the running container从正在运行的容器内将文件复制到 docker 容器
【发布时间】:2024-01-10 13:02:02
【问题描述】:

问题:如何将文件从主机复制到容器从内部正在运行的容器?

TL;TR

想法:我正在使用 gitlab 服务器,我想使用 Gitlab-ci 来
1. 测试提交
2. 将所有源文件收集到一个 .tar
3. 最后将它们部署到另一台服务器

当前状态:我的 .gitlab-ci.yml 中定义了前 3 个工作。 1 和 2 工作正常,但 rsync 抛出“主机密钥验证失败”。当然是错误的。这是我的 .gitlab-ci.yml 文件的“精简”版本:

image: alpine

stages:
  - test
  - package
  - deploy

test:
  stage: test
  script: bla bla testing bla bla

package:
  stage: package
  script: tar -cvf source.tar htdocs    

deploy:
  stage: deploy
  before_script:
  - apk update
  - apk add rsync openssh
  script:
   - rsync -vuar source.tar servadmin@123.123.123.123:/home/servadmin/transfer

除了这个 .yml 文件之外,我无法访问这些容器,因此我确实需要找到一种方法将公钥从主机复制到容器,但我必须从容器内部执行此操作。或者我可以使用多跑步者等,但我是 ci 的新手,我暂时可以避免这种情况

【问题讨论】:

  • 您是否尝试为存在公钥的 gitlab 运行器创建自定义图像?
  • 能否将密钥作为卷挂载到容器中?能够将任意文件从主机复制到容器中会带来巨大的安全风险。
  • 我使用了 COPY 而不是 VOLUME。这也会带来安全风险吗?

标签: docker gitlab-ci


【解决方案1】:

我发现了一个受上述 cmets 启发的解决方法,以及一个我想不起来的地方发现的示例:
1. Dockerfile:

FROM alpine
COPY id_rsa /root/.ssh/
  1. .gitlab-ci.yml(仅针对“部署”作业进行更改):

deploy:
  stage: deploy
    before_script:
      - apk update
      - apk add rsync openssh
      - mkdir -p /root/.ssh
      - eval "$(ssh-agent -s)"
      - echo "    IdentityFile ~/.ssh/id_rsa" >> /etc/ssh/ssh_config

      # install ssh-agent
      - 'which ssh-agent || ( apk update -y && apk add openssh-client -y )'

      # run ssh-agent
      - eval $(ssh-agent -s)

      #copy key to file
      - cp /root/.ssh/id_rsa ./key.file
      - chmod 600 ./key.file

      # add ssh key stored in SSH_PRIVATE_KEY variable to the agent store
      - ssh-add ./key.file

      # disable host key checking (NOTE: makes you susceptible to man-in-the-middle attacks)
      # WARNING: use only in docker container, if you use it with shell you will overwrite your user's ssh config
      - mkdir -p ~/.ssh
      - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'

      script:
       - rsync -arvvvce "ssh -o StrictHostKeyChecking=no" source.tar servadmin@123.123.123.123:/home/servadmin/transfer

我猜-arvvvce "ssh -o StrictHostKeyChecking=no" 可以替换为-vuar,但没有经过测试。

【讨论】:

    最近更新 更多