如何在Docker容器内启动并保持后台进程

7

我需要在 Docker 容器中启动一个后台作业(Google SQL Proxy),实际上它是一个 AppEngine 镜像。

在尝试启动后台作业时,我遇到了一些问题。我发现,要么在运行脚本的 RUN 命令中分离容器后立即丢弃了作业,要么容器停止正常工作(请参见 CMD 命令在脚本中的用法)。

以下是 Dockerfile 的内容:

FROM eu.gcr.io/google-appengine/ubuntu-php56

ADD ./run.sh /app
RUN chmod 777 /app/run.sh
#RUN nohup /app/run.sh & #This is lost the moment I finished creation of container
CMD nohup /app/run.sh & #This crash the container

这是run.sh文件:

#!/bin/bash
while true
do
 echo "Beep"
 sleep 2
done

这里是构建Docker镜像的命令:
docker image build --tag red .

以下是创建Docker容器的命令:

docker run -d -p 8080:8080 --name red1 red

以下是我连接容器以查看其中内容的方法:

docker exec -it red1 /bin/bash

我的目标是能够启动并长时间运行run.sh脚本。


你想在容器中运行其他进程吗? - Ignacio Millán
你尝试过在进入Bash后手动运行命令吗? - Tree
@Ignacio Millan 我想要在我的容器中添加一个或多个后台进程。 - Alex
@Tree 是的,它按照预期工作了。 - Alex
3个回答

7

首先,在appengine中没有必要运行sql代理,您可以直接连接到数据库实例。

不管怎样,容器存在是因为每个容器都需要一个(且仅有一个)前台进程。将CMD更改为运行任何其他前台进程即可实现目标:

CMD nohup /app/run.sh & sleep infinity

在这种情况下,前台进程是休眠状态,您可以将其更改为运行您应用程序的进程。

我的应用程序分为在AppEngine内部运行的Docker容器中的PHP代码和我的数据库位于Cloud SQL中。到目前为止,我没有看到除SQL代理之外连接到我的容器中的Cloud SQL的其他选项。 - Alex
AppEngine提供了一个Unix套接字,可以直接连接到cloudSQL。以下是Python的示例:https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/appengine/standard/cloudsql - Ignacio Millán
AppEngine提供了一个Unix套接字,但仅适用于标准的AppEngine应用程序。我有一个基于Google提供的Docker镜像的自定义运行时(https://cloud.google.com/appengine/docs/flexible/custom-runtimes/),似乎在该Google Docker镜像内部没有预安装Unix套接字,因此您必须以某种方式添加它。 - Alex
好的,我认为可以通过TCP直接连接,或者使用SQL代理并使用此CMD。 - Ignacio Millán

1

我认为你应该使用ENTRYPOINT命令来实现这个目的。请查看文档这里


ENTRYPOINTS 似乎是用于在容器中添加参数或其他命令的情况。我只想能够启动一些后台作业(例如我的 run.sh)。 - Alex

0

为了充当Cloud SQL代理,我建议使用单独的Docker镜像,可以通过以下命令获取:

docker pull gcr.io/cloudsql-docker/gce-proxy:1.12

您可以使用以下命令运行它:

docker run -d \
  -v <PATH_TO_KEY_FILE>:/config \
  -p 127.0.0.1:5432:5432 \
  gcr.io/cloudsql-docker/gce-proxy:1.12 /cloud_sql_proxy \
  -instances=<INSTANCE_CONNECTION_NAME>=tcp:0.0.0.0:5432 -credential_file=/config

这是一个关于Postgress的例子。对于MySQL,请使用3306端口。

如需逐步配置包括所有必要的范围和权限,请查看文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接