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

时间:2018-10-17 13:26:26

标签: docker google-app-engine dockerfile

我需要在Docker容器(实际上是AppEngine映像)内启动后台作业(Google SQL代理)。

经过一番努力,我发现尝试启动后台作业或者在我从容器中分离时丢弃了该作业(请参见脚本中的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运行。

3 个答案:

答案 0 :(得分:1)

我认为您应该使用ENTRYPOINT命令来执行此操作。 看一下文档here

答案 1 :(得分:1)

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

无论如何,该容器存在是因为每个容器都需要一个(也只有一个)前台进程。更改CMD以在前台运行任何其他进程即可完成工作:

CMD nohup /app/run.sh & sleep infinity

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

答案 2 :(得分: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端口。

For step by step configuration including all needed scopes and permissions please check documentation