Docker“备份”进程容器未看到数据库容器postgres

pxq42qpu  于 2023-02-03  发布在  Docker
关注(0)|答案(1)|浏览(152)

我有一个简单的docker-compose.yml和相关的Dockerfiles,它为nginx-uvicorn-django-postgres堆栈给予了一个简单的开发和生产环境。我想添加一个可选的“备份”容器,它只运行cron以定期连接到“postgres”容器。

# backup container - derived from [this blog][1]
ARG DOCKER_REPO
ARG ALPINE_DOCKER_IMAGE  # ALPINE
ARG ALPINE_DOCKER_TAG    # LATEST
FROM ${DOCKER_REPO}${ALPINE_DOCKER_IMAGE}:${ALPINE_DOCKER_TAG}

ARG DB_PASSWORD
ARG DB_HOST     # "db"
ARG DB_PORT     # "5432"
ARG DB_NAME     # "ken"
ARG DB_USERNAME # "postgres"

ENV PGPASSWORD=${DB_PASSWORD} HOST=${DB_HOST} PORT=${DB_PORT} PSQL_DB_NAME=${DB_NAME} \
    USERNAME=${DB_USERNAME}

RUN printenv

RUN  mkdir /output && \
     mkdir /output/backups  && \
     mkdir /scripts  && \
     chmod a+x /scripts
COPY ./scripts/ /scripts/
COPY ./scripts/in_docker/pg_dump.sh /etc/periodic/15min/${DB_NAME}_15
COPY ./scripts/in_docker/pg_dump.sh /etc/periodic/daily/${DB_NAME}_day
COPY ./scripts/in_docker/pg_dump.sh /etc/periodic/weekly/${DB_NAME}_week
COPY ./scripts/in_docker/pg_dump.sh /etc/periodic/monthly/${DB_NAME}_month

RUN apk update && \
    apk upgrade && \
    apk add --no-cache postgresql-client && \
    chmod a+x /etc/periodic/15min/${DB_NAME}_15 && \
    chmod a+x /etc/periodic/daily/${DB_NAME}_day && \
    chmod a+x /etc/periodic/weekly/${DB_NAME}_week && \
    chmod a+x /etc/periodic/monthly/${DB_NAME}_month

django容器是从官方Python映像中派生出来的,它(通过psycopg 2)与host,dbname,username,password和port的值(作为ENV值)连接。'backup'容器也有这些相同的值,但是我在命令行中得到了这个错误:

> pg_dump --host="$HOST" --port="$PORT" --username="$USERNAME" --dbname="$PSQL_DB_NAME"
pg_dump: error: could not translate host name "db" to address: Name does not resolve

Alpine是否缺少了一些官方Python中存在的相关内容?
编辑:我运行的是一个shell脚本系统,负责不同配置的内务处理。

> ./ken.sh dev_server

将设置环境变量,然后为项目运行docker-compose,docker-compose.yml容器不会显式创建网络。
我不知道除了'db://'之外,“db”还应该解析什么?-这是django容器得到的,它能够解析到'db'服务的连接。

service:
  db:
    image: ${DOCKER_REPO}${DB_DOCKER_IMAGE}:${DB_DOCKER_TAG} #postgres: 14
    container_name: ${PROJECT_NAME}_db
  volumes:
    - pgdata:/var/lib/postgresql/data
  environment:
    - PGPASSWORD
    - POSTGRES_DB=${DB_NAME}
    - POSTGRES_USER=${DB_USERNAME}
    - POSTGRES_PASSWORD=${DB_PASSWORD}
command: ["postgres", "-c", "log_statement=all"]
healthcheck:
  test: ["CMD-SHELL", "pg_isready -U postgres -h db"]
  interval: 2s
  timeout: 5s
  retries: 25

这是由父级www.example.com脚本运行的“dev_server”脚本ken.sh

function dev_server() {
    trap cleanup EXIT
    wait_and_launch_browser &

    docker-compose -p "${PROJECT_NAME}" up -d --build db nginx web pgadmin backup

    echo "Generate static files and copy them into static and file volumes."
    source ./scripts/generate_static_files.sh

    docker-compose -p "${PROJECT_NAME}" logs -f web nginx backup
}

更新:通过"Reasons why docker containers can't talk to each other"工作,发现所有容器都在ken_default网络上,从170.20.0.2到170.20.0.6。
我可以docker exec ken_backup backup ken_db -c2,但不能从数据库到备份,因为数据库容器不包括ping。
从备份的shell中,我无法ping ken_db- ken_db无法解析,“db”也无法解析。
我不能做太多,我不知道下一步该怎么做。

bzzcjhmw

bzzcjhmw1#

您正在将备份容器作为单独的服务运行。
Docker-compose为每个服务创建唯一的网络(docker-compose.yml文件)。
您需要在同一个Docker网络上获取DB和备份容器。
查看此post

相关问题