我需要在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运行。
答案 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端口。