在Docker容器中启动Postgres

3

为了进行测试,我正在尝试在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并直接运行测试套件。

这里有什么我忽略的吗?


1
你的 RUN service postgresql stop && service postgresql start 在 RUN 中,而不是在 CMD 或 ENTRYPOINT 中,所以当容器启动时它被“遗忘”了。 - user2915097
请查看位于 https://github.com/docker-library/postgres/blob/3d4e5e9f64124b72aa80f80e2635aff0545988c6/9.6/Dockerfile 的参考 PostgreSQL Dockerfile。 - user2915097
我将 RUN 改为 CMD,但它仍然显示相同的错误。 - doremi
在Dockerfile中您只能有一个CMD,将使用最新的CMD,请查看我的答案中提供的链接以及supervisor链接。 - user2915097
1个回答

2
在 Dockerfile 中,你有:
  • 配置阶段,使用 RUN 指令(和其他一些指令)

  • 你启动的进程,放在以下其中之一:

CMD

或者

ENTRYPOINT

请参阅文档。

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

并且

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

当一个容器在启动阶段完成了它需要做的事情后,它就会停止运行。
这就是为什么PostgreSQL的参考Dockerfile位于此处。

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

以...结束; CMD ["postgres"] 如果您想要启动多个进程,请参考supervisord或类似的工具(s6,daemontools...)。

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


这非常有道理。我能否用一个Bash脚本来替换我的最终ENTRYPOINT,以便同时启动PG和gunicorn? - doremi
是的,这是一个选项,请阅读https://dev59.com/mmEi5IYBdhLWcg3wK5rd,您可以将entrypoint视为动词,CMD作为参数,请参见https://hub.docker.com/r/k3ck3c/nethogs/如果您只运行它,它会开始监视wlan0设备,如果在`docker run...`的末尾添加wlp2s0(或eth1或任何其他内容),它将监视wlp2s0(或eth1或任何其他内容)。 - user2915097

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接