簡體   English   中英

自定義docker映像未運行postgres

[英]custom docker image is not running postgres

我正在嘗試為circleci v2創建自己的自定義docker文件。 但是,我遇到了postgres服務器未運行的問題。 我已經運行service postgresql start到不可用。

我收到的消息是:

psql: could not connect to server: Connection refused
    Is the server running locally and accepting
    connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

Dockerfile:

FROM ubuntu:16.04

ENV NODEJS_VERSION 6
ENV POSTGRESQL_VERSION 9.6

RUN apt-get update && apt-get -y install curl
RUN curl -sL https://deb.nodesource.com/setup_$NODEJS_VERSION.x | bash -
RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8
RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main" > /etc/apt/sources.list.d/pgdg.list
RUN apt-get update

RUN apt-get install -y \
  nodejs \
  make \
  git \
  g++ \
  python-software-properties \
  software-properties-common \
  postgresql-$POSTGRESQL_VERSION \
  postgresql-client-$POSTGRESQL_VERSION \
  postgresql-contrib-$POSTGRESQL_VERSION

RUN echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/$POSTGRESQL_VERSION/main/pg_hba.conf
RUN echo "listen_addresses='*'" >> /etc/postgresql/$POSTGRESQL_VERSION/main/postgresql.conf

USER postgres
RUN service postgresql start && \
  psql -c "create database pgdb;" && \
  psql -c "create role pgrole with login password 'pgrole'; grant all privileges on database pgdb to pgrole;"

也可以看看:

謝謝

問題

問題是您沒有定義映像應運行的命令,因此它默認為在Ubuntu基本映像中設置的命令: /bin/bash

看一下CMD的文檔:

注意:不要將RUNCMD混淆。 RUN實際上運行命令並提交結果。 CMD在生成時不執行任何操作,但會指定映像的預期命令。

因此,您的RUN service postgresql start構建時執行,並且該命令的結果作為層提交給映像。 當您啟動圖像時,例如在CircleCI上,將執行圖像的CMD 而且由於您沒有設置,所以它使用Ubuntu指定的一個: /bin/bash 這意味着在運行時 ,實際上Postgres正在運行。

要記住的另一件事是, CMD一定不能是守護進程。 只要在前台執行進程,Docker就會保持容器運行,因此,如果您執行CMD service postgresql start ,則在命令返回后,Docker會退出該容器。

解決方案

我建議您重做整個CI設置。 如果在CMD啟動Postgres,則無法覆蓋該命令以運行測試(否則Postgres將不會再次運行)。

而是使用兩張圖片,一張用於您的應用,另一張用於Postgres。 您啟動Postgres,等待它接受連接,然后在您的app容器中運行測試。

您可以重用現有的postgresql映像,該映像在啟動時會為您創建數據庫和用戶。 您需要添加腳本以等待數據庫准備就緒,否則測試將在數據庫接受連接之前運行。 看到這個帖子: https : //discuss.circleci.com/t/waiting-for-database/10946

使用這種方法,一次運行多個服務要容易得多,並且仍然可以完全自由地選擇要在Circle CI上運行的命令。

另類

創建一個啟動Postgres並等待其准備就緒的入口點的選項稍微容易一些,但僅用於測試。 創建一個腳本,將其復制到Dockerfile ,然后將ENTRYPOINT指向該ENTRYPOINT 在腳本中,運行services postgresql start ,創建數據庫,然后等待Postgres接受連接。 完成后,使用exec $@執行傳遞到容器的任何命令。

您可以在此處找到用於等待Postgres的腳本: https : //gist.github.com/jdno/09377bde65095773e5daf1aaa8e62ef4

可以輕松地將此腳本擴展為ENTRYPOINT

  • 使用services postgresql start啟動Postgres。
  • 等待Postgres接受連接(即腳本現在執行的操作)。
  • 運行psql命令來創建數據庫。
  • exec $@結束腳本以執行Docker CMD

設置起來比較容易,但不適合生產。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM