![](/img/trans.png)
[英]/bin/sh: =: not found when running docker container from custom image
[英]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的文檔:
注意:不要將
RUN
與CMD
混淆。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。 psql
命令來創建數據庫。 exec $@
結束腳本以執行Docker CMD
。 設置起來比較容易,但不適合生產。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.