NewFuture / DDNS

:triangular_flag_on_post: 自动更新域名解析到本机IP(支持dnspod,阿里DNS,CloudFlare,华为云,DNSCOM...)
https://ddns.newfuture.cc/
MIT License
4.31k stars 657 forks source link

[debug]Docker运行出错 #290

Closed Huiaei closed 2 years ago

Huiaei commented 2 years ago

Describe the bug [描述]

按照指示运行docker run -d -v /path/to/config.json:/config.json --network host newfuture/ddns

运行出现

ERROR:root: Config file `/config.json` does not exist!

[9] Failed to execute script run

Traceback (most recent call last):

  File "util/config.py", line 70, in __load_config

IsADirectoryError: [Errno 21] Is a directory: '/config.json'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

  File "run.py", line 154, in <module>

  File "run.py", line 119, in main

  File "util/config.py", line 60, in init_config

  File "util/config.py", line 78, in __load_config

IsADirectoryError: [Errno 21] Is a directory: '/config.json'

进入容器内部发现config.conf是一个文件夹,并且无法移除

/ # ls
bin          dev          lib          opt          run          sys          var
config.json  etc          media        proc         sbin         tmp
ddns         home         mnt          root         srv          usr
/ # rm -rf config.json/
rm: can't remove 'config.json': Resource busy

To Reproduce [复现]

version info [基本信息]

config file [配置文件]

{
}

debug output [调试输出]

粘贴输出日志
paste out put here

Additional context

NN708 commented 2 years ago

请见 #267

Huiaei commented 2 years ago

没怎么看懂https://github.com/NewFuture/DDNS/issues/267 自己照着dockerfile改了个。不会用git就贴在这了。

Dockerfile

FROM six8/pyinstaller-alpine:alpine-3.6-pyinstaller-v3.4
WORKDIR /build
COPY . .

RUN pyinstaller --onefile --noconfirm --clean ./.build/ddns.spec

FROM alpine:latest
LABEL maintainer="NN708"
ENV ddnsdir /app 
WORKDIR ${ddnsdir}

RUN mkdir /backup
COPY --from=0 /build/dist/ddns /backup
RUN echo "*/5 * * * *   ${ddnsdir}/ddns -c ${ddnsdir}/config.json" > /etc/crontabs/root \
    && cp -r /backup ${ddnsdir}

RUN touch /entrypoint.sh \
    && chmod 755 /entrypoint.sh \
    && echo "#!/bin/sh">> /entrypoint.sh \
    && echo "cp -r /backup/* ${ddnsdir}">> /entrypoint.sh \
    && echo "${ddnsdir}/ddns">> /entrypoint.sh \
    && echo "crond -f">> /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

docker run

docker run -d -v $PWD/ddns:/app --network host  --name DDNS ddns:latest

docker-compose.yml

version: "3"
services:
  DDNS:
    image: ddns:latest
    container_name: DDNS
    restart: unless-stopped
    tty: true
    network_mode: "host"
    volumes:
      - ./ddns:/app

docker run 和 docker compose 的镜像要改一下,只是在本地构建的,没有上传云端。 两个运行方式都是在命令行当前位置挂载出ddns文件夹,里面包括运行文件和初始化的配置文件,对应容器内部/app。 我用的是windows,以我为例。推荐是建立一个文件夹,然后在这文件夹里在此处打开xxx(shift+右键),然后运行部署。

本来一开始是想直接获取Release的成品,但是好像没有直接获取最新发布的直连,就放弃了。

Huiaei commented 2 years ago

dockerfile有些地方还能精简下,我个人测试是 docker run 和 docker compose 都能正常部署

Huiaei commented 2 years ago

Windows Docker 不支持开 IPV6 ,还是乖乖用回 Windows 版好了