一尘不染

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

docker

我在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并使用网址,因为它不会经常更改


阅读 288

收藏
2020-06-17

共1个答案

一尘不染

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

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

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

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