【问题标题】:How to setup a daemon service in a Dockerfile for Google Cloud如何在 Dockerfile 中为 Google Cloud 设置守护程序服务
【发布时间】:2019-02-19 18:13:19
【问题描述】:

我想创建一个在 Google Cloud 上运行 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”命令来保持容器的正常运行。有没有更合适的方法来保持容器正常运行?

当我在本地运行容器时,它可以正常工作:

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

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

但是,当我在谷歌云上构建和运行映像时,squid 进程似乎不断重启,因此它完全忽略了 bash 语句。有什么想法吗?

在哪些情况下更适合使用:

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

【问题讨论】:

    标签: docker google-cloud-platform squid


    【解决方案1】:

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

    CMD ["squid", "-NCd1"]
    

    尤其是-N 选项会使其作为前台非守护进程运行。

    (如果可以的话,您还应该更喜欢CMDENTRYPOINT 的JSON 格式。虽然很多人更喜欢ENTRYPOINT,但如果可以选择,我总是使用CMD,因为在@ 处更容易覆盖987654329@ 时间,并允许一个入口点脚本模式执行启动前初始化,然后运行CMD。)

    【讨论】:

    • 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 2010-11-12
    • 1970-01-01
    相关资源
    最近更新 更多