dify填坑
在内网的ARM服务器上用docker部署dify1.1.2版本,照手册和网上文档出现问题。包括环境变量配置、无法安装插件、主机时区等
1、变量设置,根据手册或网上介绍,复制.env.example(环境变量文件)为.env,然后修改.env 和 docker-compose-template.yaml,再执行generate_docker_compose来生成新的docker-compose.yaml文件,最后用docker up -d来启动。后来翻了源码才发现,generate_docker_compose的逻辑其实是:.env.example + docker-compose-template.yaml = docker-compose.yaml。其中.env.example定义环境变量,docker-compose-template.yaml定义服务配置(引用了.env.example中的变量)。这里的环境变量定义不对,就会引发后面的问题
2、由于是内网服务器,本来以为插件可以离线安装,结果安装插件时还要下载相关依赖,plugin_daemon容器总是报网络错误,只好配置代理服务器,并将pip源改为清华。直接在docker-compose-template.yaml中容器plugin_daemon的环境变量中新增,不能随便在.env.example中新增环境变量HTTP_PROXY,那样可能导致其他使用容器出现问题。
HTTP_PROXY: http://proxy-ip:3128 HTTPS_PROXY: http://proxy-ip:3128 NO_PROXY: inter_ip/8,localhost,127.0.0.1,10.0.0./8,192.0.0.0/8,172.0.0.0/8
3、日志显示的时间是UTC,差了8个小时。以为在.env.example中设置LOG_TZ=Asia/Shanghai就行,结果发现部分容器不用这个变量。这里使用大模型帮我生成了一个脚本批量快速查看容器日志:
docker ps --format '{{.Names}}' | while read -r container_name; do echo "查看容器 $container_name 的最后 3 行日志:" docker logs --tail 3 "$container_name" echo "-----------------------------" done
同时为了让主机的时区正常,对不使用全局环境变量的容器需要在docker-compose-template.yaml单独指定LOG_TZ和TZ
4、使用docker build . -t dify-api方式自己打包镜像需要注意网络和源的问题:
- Dockerfile中备注的国内需要设置的debian源(https://mirrors.tuna.tsinghua.edu.cn),其中debian源替换最好使用https,否则可能apt-get install过程报错:RUN sed -i 's@http://deb.debian.org@https://mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources。pip源也需要换
# base image FROM python:3.12-slim-bookworm AS base ENV http_proxy=http://ip:port ENV https_proxy=http://ip:port ENV no_proxy=localhost,127.0.0.1,.srdcloud.cn,172.0.0.1/8,10.0.0.1/8,192.168.0.0/16 WORKDIR /app/api # Install Poetry ENV POETRY_VERSION=2.0.1 # if you located in China, you can use aliyun mirror to speed up RUN pip install --no-cache-dir poetry==${POETRY_VERSION} -i https://mirrors.aliyun.com/pypi/simple/ # RUN pip install --no-cache-dir poetry==${POETRY_VERSION} # Configure Poetry ENV POETRY_CACHE_DIR=/tmp/poetry_cache ENV POETRY_NO_INTERACTION=1 ENV POETRY_VIRTUALENVS_IN_PROJECT=true ENV POETRY_VIRTUALENVS_CREATE=true ENV POETRY_REQUESTS_TIMEOUT=15 FROM base AS packages # if you located in China, you can use aliyun mirror to speed up RUN sed -i 's@http://deb.debian.org@https://mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources RUN apt-get update && apt-get install -y --no-install-recommends gcc g++ libc-dev libffi-dev libgmp-dev libmpfr-dev libmpc-dev # Install Python dependencies #COPY pyproject.toml poetry.lock ./ COPY pyproject.toml ./ RUN poetry lock RUN poetry install --sync --no-cache --no-root # production stage FROM base AS production ENV FLASK_APP=app.py ENV EDITION=SELF_HOSTED ENV DEPLOY_ENV=PRODUCTION ENV CONSOLE_API_URL=http://127.0.0.1:5001 ENV CONSOLE_WEB_URL=http://127.0.0.1:3000 ENV SERVICE_API_URL=http://127.0.0.1:5001 ENV APP_WEB_URL=http://127.0.0.1:3000 EXPOSE 5001 # set timezone ENV TZ=Asia/Shanghai WORKDIR /app/api RUN sed -i 's@http://deb.debian.org@https://mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources RUN apt-get update && apt-get install -y --no-install-recommends \ # basic environment curl nodejs libgmp-dev libmpfr-dev libmpc-dev \ # For Security expat libldap-2.5-0 perl libsqlite3-0 zlib1g \ # install a package to improve the accuracy of guessing mime type and file extension media-types \ # install libmagic to support the use of python-magic guess MIMETYPE libmagic1 \ && apt-get autoremove -y \ && rm -rf /var/lib/apt/lists/* # Copy Python environment and packages ENV VIRTUAL_ENV=/app/api/.venv COPY --from=packages ${VIRTUAL_ENV} ${VIRTUAL_ENV} ENV PATH="${VIRTUAL_ENV}/bin:${PATH}" # Download nltk data RUN python -c "import nltk; nltk.download('punkt'); nltk.download('averaged_perceptron_tagger')" ENV TIKTOKEN_CACHE_DIR=/app/api/.tiktoken_cache RUN python -c "import tiktoken; tiktoken.encoding_for_model('gpt2')" # Copy source code COPY . /app/api/ # Copy entrypoint COPY docker/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ARG COMMIT_SHA ENV COMMIT_SHA=${COMMIT_SHA} ENV http_proxy= ENV https_proxy= ENV no_proxy= ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
- 如果要通过代理执行apt-get命令,得注意环境变量的大小写问题:ENV http_proxy=http://ip:port。如果用了HTTP_PROXY,apt-get不识别。
- pyproject.toml中要设置poetry的源,然后用peotry lock重新生成poetry.lock文件。也可以把命令放到Dockerfile中,在build过程中RUN peotry lock。
[[tool.poetry.source]] name = "tuna" url = "https://pypi.tuna.tsinghua.edu.cn/simple/" priority = "primary"
附:
1、1.1.2需要下载的docker:
docker pull langgenius/dify-web:1.1.2 docker pull langgenius/dify-api:1.1.2 docker pull langgenius/dify-plugin-daemon:0.0.6-local docker pull postgres:15-alpine docker pull nginx:latest docker pull redis:6-alpine
docker pull ubuntu/squid:latest docker pull langgenius/dify-sandbox:0.2.10 docker pull semitechnologies/weaviate:1.19.0
mirrors.tuna.tsinghua.edu.cn