簡體   English   中英

dockerize 不會延遲容器初始化

[英]dockerize does not delay the container initialization

我現在正在為我的項目准備圖像。 我使用dockerize來控制我的初始化。 我不確定對 docker 給出的IP地址進行硬編碼是否可行?

問題: backend不會等到database首先完成初始化。

終端說

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.docker文件

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

存儲庫文件

create extension hstore;

后端.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"]

docker-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

更新:
我曾嘗試過這樣的臨時解決方案。 但它不起作用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 服務已准備就緒。 加載、設置用戶、密碼、創建數據庫或加載數據庫以及進行所需的所有授權都需要一些時間。

我在 Flask 和 MySQL 上遇到了類似的問題,我像你一樣創建了一個 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

暫無
暫無

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

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