【问题标题】:Docker postgres doesn't start at buildDocker postgres 不是从构建开始的
【发布时间】:2018-09-25 08:26:50
【问题描述】:

我想使用 docker 容器来模拟我的生产环境,所以我将 db 和服务器安装在同一个容器中,而不是各自安装。

这是我的 dockerfile:

FROM debian
RUN apt update
RUN apt install postgresql-9.6 tomcat8 tomcat8-admin -y
RUN service postgresql start
RUN service postgresql status # says postgres is down
RUN su - postgres ;
RUN createdb db_example # fails !!!
RUN psql -c "CREATE USER springuser WITH PASSWORD 'test123';"
RUN exit
RUN service tomcat8 start

COPY target/App-1.0.war /var/lib/tomcat8/webapps/

CMD ["/bin/bash"]

问题是数据库已关闭,因此我无法创建用户和数据库。
如果我启动一个 debian docker 容器并手动执行此步骤,一切正常。

感谢您的帮助

【问题讨论】:

  • 不建议在一个图像中包含多个服务以及在可写层中为数据库持久化数据。你能解释一下你为什么要部署吗?
  • 我想模拟生产环境,那里是这样弄的。
  • 你在生产环境中有postgresql和tomcat服务器在同一个镜像中?还是只是postgresql和tomcat在同一个网络?
  • 在同一个虚拟机中。
  • 一般情况下,我们会尽可能地保留较薄的图像。可能有其他等价物来模拟其他环境。在您的情况下,postgresql 和 tomcat 在同一个虚拟机中。也许 --net 标志对于值主机就足够了,这意味着在执行 'docker run' 时添加'--net=host'。使用此标志,两个容器将在同一个网络命名空间中工作。如果您仍然想让它们在相同的 CPU/内存组中工作,docker 可能是您需要的最后一个工具。由于 docker 以相反的方式工作。它提供了孤立的环境,并且擅长于此。

标签: postgresql docker dockerfile postgresql-9.6


【解决方案1】:

所有cmets中的建议都是正确的,最好将服务保持在不同的容器中。

尽管如此,只是让您知道,Dockerfile 中的问题是在 RUN 语句中启动服务是无用的。对于 Dockerfile 中的每一行,docker 都会创建一个新图像。例如RUN service postgresql start,它可能会在 docker build 期间启动 postgresql,但它不会保留在最终映像中。只有文件系统从一个步骤持续到另一个步骤,而不是进程。

每个进程都需要在入口点启动,这是执行 docker run 时唯一调用的命令:

FROM debian
RUN apt update
RUN apt install postgresql-9.6 tomcat8 tomcat8-admin -y

COPY target/App-1.0.war /var/lib/tomcat8/webapps/

ENTRYPOINT["/bin/bash", "-c", "service postgresql start && service postgresql status && createdb db_example && psql -c \"CREATE USER springuser WITH PASSWORD 'test123';\" && service tomcat8 start && sleep infinity"]

(psql命令的引号可能有问题)

【讨论】:

    【解决方案2】:

    我在战争文件中有问题帽子,数据库战争硬编码的本地主机。
    感谢Light.G,他建议我使用 --net=host 作为容器,所以现在有一个容器用于数据库,一个容器用于 tomcat 服务器。

    这是我遵循的步骤。

    构建 docker 镜像

    docker build -t $USER/App .

    启动 postgres 数据库

    我们正在使用主机命名空间,因此无法在 5432 后运行另一个程序。
    像这样启动 postgres 容器:
    docker run -it --rm --net=host -e POSTGRES_USER='springuser' -e POSTGRES_DB='db_example' -e POSTGRES_PASSWORD='test123' postgres

    启动tomcat

    使用以下命令启动 App 容器:
    docker run -it --net=host --rm $USER/App

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-30
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 2021-12-17
      • 1970-01-01
      相关资源
      最近更新 更多