【问题标题】:Starting Postgres in Docker Container在 Docker 容器中启动 Postgres
【发布时间】:2017-04-19 17:45:55
【问题描述】:

为了测试,我正在尝试在 docker 容器中设置 Postgres,以便我们的 python 应用可以针对它运行它的测试套件。

这是我的 Dockerfile:

# Set the base image to Ubuntu
FROM ubuntu:16.04

# Update the default application repository sources list
RUN apt-get update && apt-get install -y \
  python2.7 \
  python-pip \
  python-dev \
  build-essential \
  libpq-dev \
  libsasl2-dev \
  libffi-dev \
  postgresql

USER postgres
RUN /etc/init.d/postgresql start && \
  psql -c "CREATE USER circle WITH SUPERUSER PASSWORD 'circle';" && \
  createdb -O darwin circle_test
USER root
RUN service postgresql stop && service postgresql start

# Upgrade pip
RUN pip install --upgrade pip

COPY . /app
WORKDIR /app

RUN pip install -r requirements.txt

EXPOSE 5000

# Set the container entrypoint
ENTRYPOINT ["gunicorn", "--config", "/app/config/gunicorn.py", "--access-logfile", "-", "--error-logfile", "-", "app:app"]

当我跑步时:

docker run --entrypoint python darwin:latest -m unittest discover -v -s test

我明白了:

could not connect to server: Connection refused
        Is the server running on host "localhost" (127.0.0.1) and accepting
        TCP/IP connections on port 5432?

我可以让它工作的唯一方法是,如果我 ssh 进入容器,重新启动 postgres 并直接运行测试套件。

这里有什么我遗漏的吗?

【问题讨论】:

  • 您的 RUN service postgresql stop && service postgresql start 处于 RUN 中,而不是 CMD 或 ENTRYPOINT 中,因此在容器启动时它被“遗忘”
  • 看看github.com/docker-library/postgres/blob/…的参考PostgreSQL Dockerfile
  • 我将RUN 更改为CMD,但仍然出现相同的错误。
  • 一个 Dockerfile 中只能有一个 CMD,用的是最新的,看我回答里的链接,还有主管一个

标签: postgresql docker dockerfile


【解决方案1】:

在 Dockerfile 中你有

  • 配置阶段,RUN 指令(以及其他一些指令)

  • 你启动的进程,你放入其中一个

CMD

ENTRYPOINT

查看文档

https://docs.docker.com/engine/reference/builder/#cmd

https://docs.docker.com/engine/reference/builder/#entrypoint

当一个容器完成了它在这个开始阶段必须做的事情时,它就会死亡。

这就是为什么参考 Dockerfile for PostgreSQL,在

https://github.com/docker-library/postgres/blob/3d4e5e9f64124b72aa80f80e2635aff0545988c6/9.6/Dockerfile

结尾

CMD ["postgres"]

如果要启动多个进程,请参阅 supervisord 或类似工具(s6、daemontools...)

https://docs.docker.com/engine/admin/using_supervisord/

【讨论】:

  • 这很有意义。我可以用一个同时启动 PG 和 gunicorn 的 bash 脚本交换我的最终 ENTRYPOINT 吗?
  • 是的,这是一个选项,阅读stackoverflow.com/questions/21553353/…你可以看到入口点作为动词,CMD作为参数,看到hub.docker.com/r/k3ck3c/nethogs如果你只是运行它,它开始监视wlan0设备,如果您在 docker run... 末尾添加 wlp2s0(或 eth1 或任何),它会监控 wlp2s0(或 eth1 或任何)
猜你喜欢
  • 1970-01-01
  • 2020-01-28
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 2016-04-14
  • 2013-10-20
  • 2014-11-22
相关资源
最近更新 更多