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