【问题标题】:How to run or deploy an app with a git dependency to a private repo如何运行或部署具有 git 依赖关系的应用程序到私有仓库
【发布时间】:2015-01-09 02:20:54
【问题描述】:

我的应用程序对私有 BitBucket 存储库有一个 Git 依赖项。

  my_package:
    git:
      url: git@bitbucket.org:myuser/mypackage.git

当我跑步时

gcloud --verbosity debug preview app run app.yaml

我明白了

Resolving dependencies...
Git error. Command: git clone --mirror git@bitbucket.org:myuser/my_package.git /root/.pub-cache/git/cache/my_package-6fe77906161a7a9252973e29e39a4149b75f9a7e
error: cannot run ssh: No such file or directory
fatal: unable to fork

我想在Dockerfile 中添加ADD 指令将是一个可行的解决方法。
当然,需要将 repo 检出到本地目录才能完成这项工作。

我试过了:

FROM google/dart-runtime
ADD ../my_package ../my_package

https://docs.docker.com/reference/builder/#add

The <src> path must be inside the context of the build; you cannot ADD 
../something /something, because the first step of a docker build is to
send the context directory (and subdirectories) to the docker daemon.

看来我必须将..my_package 目录移动到my_app 目录中。这不漂亮:-(

当我向 Dockerfile 添加虚假行时,run 失败,但如果我添加 ADD ... 指令,它似乎完全被忽略了。

【问题讨论】:

  • error: cannot run ssh: No such file or directory 看来是 ssh 出了点问题?
  • 这是仅私人仓库或任何使用 SSH 的仓库的问题吗?
  • 我认为它只适用于私人回购。目前,我尝试使用已安装的 ssh-client 和 SSH 部署密钥从头开始创建 Docker 映像,但我还没有。将文件放入不在包含 Dockerfile 的目录中的 Docker 映像似乎非常困难。
  • 您不能使用其他使用 http 协议的 URL 吗?否则,我认为您必须指示 Docker 安装 ssh,并且可能像您尝试做的那样提供 ssh 密钥。
  • 我想我成功了。明天我会验证并添加答案。

标签: google-app-engine dart dart-pub


【解决方案1】:

更新 2

我之前的解决方案还是很不方便,因为每次重新启动应用之前我都必须签到。

在大力支持下,我找到了一个更方便的解决方案。 我挂载目录而不是符号链接。有关详细信息,请参阅https://superuser.com/questions/842642。 我不知道这是否以及如何在其他操作系统(Win、OX X、...)上起作用

我将 ../my_package 挂载到 docker/my_package(而不是符号链接)并使用这个 Dockerfile:

FROM google/dart

WORKDIR /app
ENV DART_SDK /usr/lib/dart

ADD dart_run.sh /dart_runtime/

RUN chmod 755 /dart_runtime/dart_run.sh && \
 chown root:root /dart_runtime/dart_run.sh

ADD pubspec.yaml /app/
ADD pubspec.lock /app/
ADD docker/my_package /my_package
RUN pub get
ADD . /app/
RUN pub get --offline

## Expose ports for debugger (5858), application traffic (8080)
## and the observatory (8181)
EXPOSE 8080 8181 5858

CMD []
ENTRYPOINT ["/dart_runtime/dart_run.sh"]

更新 1

事实证明,尽管git-daemon 是一个更方便的解决方案,但它只是为签出包的.git 目录提供服务。
我所要做的就是根据https://www.dartlang.org/cloud/ 上的文档进行所有设置,并在pubspec.yaml 中使用git 依赖项到这个由git-daemon 提供的repo。

  my_package:
    git:
      url: git://192.168.2.96/my_package
      ref: test

此 url 在本地工作以及在 Docker 容器内工作时都有效。

原创

我可以使用这个 Dockerfile 运行我的应用程序

FROM google/dart

WORKDIR /app

RUN \
  apt-get update && \
  apt-get install -y openssh-client

ADD tool/bitbucket_deployment_key /root/.ssh/id_rsa

RUN \
  mkdir -p /root/.ssh && \
  echo "Host bitbucket.org" >> /root/.ssh/config && \
  echo "    StrictHostKeyChecking no" >> /root/.ssh/config && \
#  ssh-keyscan -t rsa -H bitbucket.org,131.103.20.167 >> /root/.ssh/known_hosts && \
  chmod 400 /root/.ssh/id_rsa && \
  eval $(ssh-agent) && \
  ssh-add /root/.ssh/id_rsa

RUN \
  git clone git@bitbucket.org:myuser/my_package.git /my_package --branch test && \
  rm /root/.ssh/id_rsa

#ENV DART_SDK /usr/lib/dart

ADD dart_run.sh /dart_runtime/

RUN chmod 755 /dart_runtime/dart_run.sh && \
  chown root:root /dart_runtime/dart_run.sh

ADD pubspec.yaml /app/
ADD pubspec.lock /app/
RUN pub get
ADD . /app/
RUN pub get --offline

# Expose ports for debugger (5858), application traffic (8080)
# and the observatory (8181)
EXPOSE 8080 8181 5858

CMD []
ENTRYPOINT ["/dart_runtime/dart_run.sh"]

我使用 ssh-keygen 创建了id_rsa,没有密码。这就是我在git clone 命令之后从图像中删除文件的原因。反正以后就不用了。

在我的 BitBucket 存储库中,我添加了 id_rsa.pub 作为部署密钥。

【讨论】:

  • 聪明的主意。您是否尝试过简单地使 my_package 成为 git 依赖项?既然您安装了 ssh 密钥,那么 pub get 应该可以解决它,对吧?当然,除非你的 git repo 包含多个 dart 包(就像我的一样)
  • 据我所知,pub 通常不支持包含多个包的 repo 的 git 依赖项。我让它与对 bitbucket 存储库的 git 依赖项一起工作。问题是身份验证,但我得到了它的工作(见我的回答)。但是我觉得让容器从签出的目录中加载文件更方便,因为我不必每次更改都签入以使其在容器中生效。
  • 是的,我刚刚切换到使用上面的 git clone 技巧,而且必须一直检查很乏味。它还运行到 docker 映像克隆中,因此如果您将新更改推送到您的存储库,则会破坏事情。我需要考虑重组我的代码,这样我就可以回去处理本地项目了。我可能会尝试符号链接
  • 其实我必须在本地签到才能让它工作,但我不需要推送。基本上可以使用任何通过网络复制的方法。
  • 是的,app.yaml 等不漂亮。我正在考虑在某个时候使用磨床自动执行这些更改,以便将这些文件复制到父目录并适当地修改路径
【解决方案2】:

很抱歉将此添加为答案,但我无法在没有更多声誉的情况下发表评论:

如果您希望解决此问题,请对 google-cloud-sdk 问题 93 投票:
https://code.google.com/p/google-cloud-sdk/issues/detail?id=93

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2020-09-06
    • 2021-04-12
    • 2012-05-20
    • 1970-01-01
    相关资源
    最近更新 更多