我有一个简单的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”也无法解析。
我不能做太多,我不知道下一步该怎么做。
1条答案
按热度按时间bzzcjhmw1#
您正在将备份容器作为单独的服务运行。
Docker-compose为每个服务创建唯一的网络(docker-compose.yml文件)。
您需要在同一个Docker网络上获取DB和备份容器。
查看此post