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

问题描述 投票:2回答:3

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

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

docker google-app-engine dockerfile
3个回答
1
投票

我认为你应该使用ENTRYPOINT命令来做到这一点。看看doc here


1
投票

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

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

CMD nohup /app/run.sh & sleep infinity

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


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

这是Postgres的一个例子。对于MySQL使用3306端口。

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

© www.soinside.com 2019 - 2024. All rights reserved.