【问题标题】:Built Docker image cannot reach postgreSQL构建的 Docker 映像无法到达 postgreSQL
【发布时间】:2020-11-07 23:51:13
【问题描述】:

我使用 Django 和 PostgreSQL 作为项目的不同容器。当我使用docker-compose up 运行容器时,我的 Django 应用程序可以连接到 PostgreSQL,但同样,当我使用docker build . --file Dockerfile --tag rengine:$(date +%s) 构建 docker 映像时,该映像成功构建,但在 entrypoint.sh 上,它无法查找主机为 db。

我的 docker-compose 文件是

version: '3'

services:
    db:
        restart: always
        image: "postgres:12.3-alpine"
        environment:
            - POSTGRES_DB=postgres
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=postgres
            - POSTGRES_PORT=5432
        ports:
            - "5432:5432"
        volumes:
            - postgres_data:/var/lib/postgresql/data/
        networks:
            - rengine_network
    web:
        restart: always
        build: .
        command: python3 manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/app
        ports:
          - "8000:8000"
        depends_on:
            - db
        networks:
            - rengine_network

networks:
    rengine_network:
volumes:
  postgres_data:

入口点

#!/bin/sh

if [ "$DATABASE" = "postgres" ]
then
    echo "Waiting for postgres..."

    while ! nc -z db 5432; do
      sleep 0.1
    done

    echo "PostgreSQL started"
fi

python manage.py migrate

# Load default engine types
python manage.py loaddata fixtures/default_scan_engines.json --app scanEngine.EngineType

exec "$@"

和 Dockerfile

# Base image
FROM python:3-alpine

# Labels and Credits
LABEL \
    name="reNgine" \
    author="Yogesh Ojha <yogesh.ojha11@gmail.com>" \
    description="reNgine is a automated pipeline of recon process, useful for information gathering during web application penetration testing."

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN apk update \
    && apk add --virtual build-deps gcc python3-dev musl-dev \
    && apk add postgresql-dev \
    && apk add chromium \
    && apk add git \
    && pip install psycopg2 \
    && apk del build-deps

# Copy requirements
COPY ./requirements.txt /tmp/requirements.txt
RUN pip3 install -r /tmp/requirements.txt

# Download and install go 1.13
COPY --from=golang:1.13-alpine /usr/local/go/ /usr/local/go/

# Environment vars
ENV DATABASE="postgres"
ENV GOROOT="/usr/local/go"
ENV GOPATH="/root/go"
ENV PATH="${PATH}:${GOROOT}/bin"
ENV PATH="${PATH}:${GOPATH}/bin"

# Download Go packages
RUN go get -u github.com/tomnomnom/assetfinder github.com/hakluke/hakrawler github.com/haccer/subjack

RUN GO111MODULE=on go get -u -v github.com/projectdiscovery/httpx/cmd/httpx \
    github.com/projectdiscovery/naabu/cmd/naabu \
    github.com/projectdiscovery/subfinder/cmd/subfinder \
    github.com/lc/gau

# Make directory for app
RUN mkdir /app
WORKDIR /app

# Copy source code
COPY . /app/

# Collect Static
RUN python manage.py collectstatic --no-input --clear

RUN chmod +x /app/tools/get_subdomain.sh
RUN chmod +x /app/tools/get_dirs.sh
RUN chmod +x /app/tools/get_urls.sh
RUN chmod +x /app/tools/takeover.sh

# run entrypoint.sh
ENTRYPOINT ["/app/docker-entrypoint.sh"]

当我运行构建映像时,它在 entrypoint.sh 文件中显示没有这样的主机数据库。

谁能帮帮我,我哪里出错了?

【问题讨论】:

  • "镜像成功构建,但是在entrypoint.sh上,找不到主机作为db" ?你是怎么在构建时得到这个错误的?
  • 不,构建成功。当我使用 docker run rengine:1234 运行映像时,出现此错误

标签: django docker docker-compose docker-build


【解决方案1】:

基于评论期间出现的错误

docker run rengine:1234,

所以在这种情况下会出现错误,因为主机名db 只能在 docker-compose 网络中工作。在 docker-compose 堆栈中,一个服务可以使用 service name 与其他服务通信,但在 docker run 的情况下,两个容器都在隔离环境中运行。

您有两种选择来解决此问题

  • 运行 DB 容器并使用legacy-link 将应用程序容器与DB 链接
docker run -it --name db mydb_image
# now link application container
docker run -it --link db:db rengine:1234

现在容器将能够与主机db 通信。

  • 第二种选择是创建docker network,然后在同一个网络中运行这两个容器。
docker run -itd --network=mynetwork db

docker run -itd --network=mynetwork app

但是您已经在使用 docker-compose,所以最好使用 docker-compose 进行测试。

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 2015-11-02
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多