dockerize不会延迟容器的初始化

我现在准备为我的项目的图像。 我使用dockerize来控制我的初始化。 我不确定硬件代码是由docker给出的IP地址是否可行?

问题: backend不会等到database首先完成初始化。

terminal说

 backend_1 | django.db.utils.OperationalError: could not connect to server: Connection refused backend_1 | Is the server running on host "sakahama_db" (172.21.0.2) and accepting backend_1 | TCP/IP connections on port 5432? 

这是我的文件:

devdb.dockerfile

 FROM postgres:9.5 # Install hstore extension COPY ./Dockerfiles/hstore.sql /docker-entrypoint-initdb.d RUN mkdir -p /var/lib/postgresql-static/data ENV PGDATA /var/lib/postgresql-static/data 

hstore.sql

 create extension hstore; 

backend.dockerfile

 FROM python:2 RUN apt-get update && apt-get install -y wget ENV DOCKERIZE_VERSION v0.2.0 RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz RUN mkdir /usr/src/app WORKDIR /usr/src/app COPY requirements ./requirements RUN pip install -r requirements/local.txt COPY . . EXPOSE 8000 CMD echo "dockerize" CMD ["dockerize", "-wait", "tcp://sakahama_db:5432"] CMD echo "migrate" CMD ["python", "sakahama/manage.py", "migrate"] CMD echo "runserver" CMD ["python", "sakahama/manage.py", "runserver", "0.0.0.0:8000"] 

泊坞窗,compose.yml

 version: "2" services: backend: build: context: . dockerfile: Dockerfiles/backend.dockerfile restart: "always" environment: DATABASE_URL: postgres://username:password@sakahama_db:5432/sakahama REDISCLOUD_URL: redis://redis:6379/0 links: - sakahama_db ports: - "9000:8000" sakahama_db: build: context: . dockerfile: Dockerfiles/devdb.dockerfile environment: POSTGRES_USER: username POSTGRES_PASSWORD: password POSTGRES_DB: sakahama ports: - "5435:5432" redis: image: redis expose: - "6379" 

问题:如何正确使用dockerize

更新:
我曾尝试过这样的临时解决scheme。 但是它不起作用backend-entrypoint.sh

 #!/bin/bash echo "dockerize" dockerize -wait tcp://sakahama_db:5432 echo "migrate" python sakahama/manage.py migrate echo "runserver" python sakahama/manage.py runserver 0.0.0.0:8000 

和docker-compose.yml:
我添加一行command: ["sh", "Dockerfiles/backend-entrypoint.sh"]

当您的Postgres容器启动时,它开始接收您使用以下命令发送的tcp包: dockerize -wait tcp://sakahama_db:5432但这并不意味着Postgres服务已准备就绪。 这需要一些时间来加载,设置用户,密码,创build数据库或加载数据库,并作出所有必要的授予。

我和Flask和MySQL有类似的问题,我创build了一个和你一样的sh脚本,里面有一个简单的循环,在启动Flask应用程序之前检查服务是否启动

我不是一个shell脚本高级,但在这里遵循脚本:

 # testing if databas is up mysql -h database -uroot -proot databasename ISDBUP=$? while [[ $ISDBUP != "0" ]]; do echo "database is not up yet, waiting for 5 seconds" sleep 5; mysql -h database -uroot -proot databasename -e "SELECT 1;"; ISDBUP=$? done # starting the application python server.py app