如何在 Google Cloud 的 Dockerfile 中设置守护进程服务

How to setup a daemon service in a Dockerfile for Google Cloud

我想在 Google 云上创建一个 运行s squid 代理服务的 Dockerfile。我对 ENTRYPOINT 有点困惑:

FROM ubuntu:latest

ENV DEBIAN_FRONTEND noninteractive
ENV DEBCONF_NONINTERACTIVE_SEEN true
ENV SQUID_CACHE_DIR=/var/spool/squid
ENV SQUID_LOG_DIR=/var/log/squid

RUN apt-get install -y squid apache2-utils

COPY ./etc/squid/passwd /etc/squid
COPY ./etc/squid/squid.conf /etc/squid

EXPOSE 3128/tcp
WORKDIR /root

ENTRYPOINT service squid start && bash

Squid 是一项后台服务,因此我不得不添加 "bash" 命令以保持容器启动并 运行ning。有没有更合适的方法来保持容器启动并 运行ning?

当我在本地 运行 容器正常工作时:

docker run -d --name docker_squid -p 3128:3128 --rm -t docker_squid bash

curl -x http://localhost:3128 -L https://www.example.com

然而,当我在 google 云上构建和 运行 映像时,squid 进程似乎一直在重新启动,因此它完全忽略了 bash 语句。有什么想法吗?

在什么情况下更适合使用:

CMD service squid start && tail -F /var/log/squid/access.log

一般来说,您应该假设像 service 这样的命令在 Docker 中不起作用。您希望容器的主要进程是服务本身,这通常意味着 运行 直接连接服务器进程。 The Squid FAQ 建议调用类似

CMD ["squid", "-NCd1"]

特别是 -N 选项使它 运行 作为前台非守护进程。

(如果可以的话,您还应该更喜欢 CMDENTRYPOINT 的 JSON-ish 形式。虽然很多人更喜欢 ENTRYPOINT,但我总是使用 CMD 如果它是一个选项,以便在 docker run 时更容易覆盖,并允许入口点脚本模式执行启动前初始化,然后 运行s CMD。 )