内置 Docker 图像无法访问 postgreSQL
Built Docker image cannot reach postgreSQL
我使用 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 文件上没有这样的主机数据库。
谁能帮帮我,我哪里错了?
根据评论,错误出现在
docker run rengine:1234,
所以在这种情况下会出现错误,因为主机名 db
只能在 docker-compose 网络中工作。在 docker-compose 堆栈中,一项服务可以使用 service name
与其他服务进行通信,但在 docker run
的情况下,两个容器 运行 都处于隔离环境中。
您有两种选择来解决此问题
- 运行 数据库容器并使用 legacy-link 到 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 进行测试。
我使用 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 文件上没有这样的主机数据库。
谁能帮帮我,我哪里错了?
根据评论,错误出现在
docker run rengine:1234,
所以在这种情况下会出现错误,因为主机名 db
只能在 docker-compose 网络中工作。在 docker-compose 堆栈中,一项服务可以使用 service name
与其他服务进行通信,但在 docker run
的情况下,两个容器 运行 都处于隔离环境中。
您有两种选择来解决此问题
- 运行 数据库容器并使用 legacy-link 到 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 进行测试。