当前位置: 首页 > 面试题库 >

GAE Flexible上具有不同dockerfile的多种服务

邹英悟
2023-03-14
问题内容

我在python环境中使用Google
AppEngine Flexible
。现在,我有两个服务:default和worker,它们共享相同的代码库,由app.yaml和配置worker.yaml。现在,我需要安装本机C
++库,因此必须切换到“
定义运行时”并添加Dockerfile。

这是gcloud beta app gen-config --custom命令生成的Dockerfile

FROM gcr.io/google-appengine/python
LABEL python_version=python3.6

RUN virtualenv --no-download /env -p python3.6

# Set virtualenv environment variables. This is equivalent to running
# source /env/bin/activate
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH
ADD requirements.txt /app/
RUN pip install -r requirements.txt
ADD . /app/
CMD exec gunicorn --workers=3 --threads=3 --bind=:$PORT aces.wsgi

以前,我app.yamlworker.yaml每个人都有自己的entrypoint:配置,该配置指定了启动服务所需的命令。

因此,我的问题是如何使用两个不同的命令来启动服务?

编辑1

到目前为止,我能够通过CMD为每个服务的每次部署重写dockerfile中的行来解决此问题。但是,我对这种解决方案不太满意。

gcloud app deploy该命令具有--image- url允许从GCR设置图片网址的标志。我还没有进行过研究,但是似乎我可以将图片上传到GCR并使用网址,因为它不会经常更改


问题答案:

由于Dockerfile名称不能更改,因此不必修改Dockerfile的唯一方法是将每个服务存储在其自己的单独目录中。明确分离,每个服务都有其自己的Dockerfile和/或启动配置。

但这提出了一个问题:如何处理多个服务共享的代码?使用符号链接(非常适合在标准环境服务之间共享代码)对于灵活的环境服务不起作用,请参阅[GAE项目中的灵活环境模块之间的共享代码。

我看到了几种可能的方法,都不是很理想的方法,但是可能比您目前拥有的方法更具吸引力:

  • 硬链接每个共享的源代码文件(因为无法硬链接目录)。有点乏味且容易出错,但每个文件只需执行一次
  • 将您的共享代码打包并发布为外部库,并requirements.txt使用它添加到每个服务的文件中
  • 将共享代码拆分到一个单独的存储库中,并在每个服务中使用它共享该存储库的副本(如果使用git,则可能是git子模块)。您只需要确保在服务部署时将共享存储库拉到正确的版本-可以通过自动化非常可靠地完成。如果您在此存储库中有未提交的更改,则要稍微复杂一些-您必须在所有服务中修补相同的更改。
  • 有多个具有不同名称的Dockerfile副本,您只需复制它们即可,而不必始终编辑同一文件。用符号链接代替复制 也可能会 起作用,因为不需要在服务目录之外跟随符号链接,如果只是将符号链接复制为符号链接,它将起作用。


 类似资料:
  • 问题内容: 我是Swift的新手,我已经遍历了一些教程,其中许多教程使用同一个名称多次定义了一个函数。 我已经习惯了其他编程语言,否则将无法执行此操作。 因此,我检查了官方的Swift手册,还检查了override关键字,以了解可以得到的结果,但是仍然无法理解以下代码: 从我看到的函数tableView设置在第1行和第5行,我注意到的唯一区别是第一个tableView函数返回,而第二个函数返回(U

  • 我有一个有两个阶段的Dockerfile;第一阶段从源代码构建一个react应用程序,第二阶段复制构建并添加一个NGINX服务器: 我也在使用gitlab-ci,我希望有多个阶段:构建、测试和部署。但是我不知道如何将构建和测试阶段分开,因为我使用的是多阶段的DockerFile。问题是所有的JS测试(对于React)都需要在“Yarn build”执行之前运行,并且build被复制到seconds

  • 我想代表其他列条件以不同的顺序排列我的列。 有一张桌子看起来像这样: 如果状态为1,则按日期ASC排序,状态为0按日期DESC排序 寻找以下结果 有没有办法点这个。哪儿也找不到 谢谢

  • 问题内容: 我有一个班级用户。用户可以与许多其他用户成为朋友。这种关系是相互的。如果A是B的朋友,那么B是A的朋友。我也希望每个关系都存储其他数据,例如两个用户成为朋友的日期。因此,这是同一表上具有多列的多对多关系。我知道应该创建一个中产阶级友谊(包含两个用户ID和日期列)。但是我在将其与Hibernate映射时做得不够。使我停滞不前的是映射到了同一张表。如果多对多关系是在两个不同的表之间,则可以

  • 我有两个具有相同id的MDM配置文件,我想在同一设备上安装来自不同环境的两个不同应用程序。当我启用设备时,它将从设备中删除以前安装的应用程序。启用另一个MDM配置文件时,是否可以保存我已安装的应用程序?

  • 问题内容: 我只是有一个想法可以测试一些东西,并且有效: 输出显然是: 所以我的问题是: 这是好是坏的编码风格? 这有什么好处? 最重要的是,是否可以在声明本身中创建这样的构造? 另外…为什么甚至有可能做? 问题答案: 这是好是坏的编码风格? 像任何东西一样,这取决于情况。在某些情况下, 锯齿状数组 (称为它们)实际上是适当的。 这有什么好处? 好吧,用于将不同长度的数据集存储在一个数组中。例如,