我需要在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一直运行。
我认为你应该使用ENTRYPOINT命令来做到这一点。看看doc here
首先,没有必要在appengine中运行sql代理,可以直接连接到您的数据库实例。
无论如何,容器存在,因为每个容器都需要一个(并且只有一个)前台进程。更改CMD以在前台运行任何其他进程可以使工作:
CMD nohup /app/run.sh & sleep infinity
在这种情况下,前台进程是睡眠,您可以为运行应用程序的进程更改它。
要充当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端口。