我正在嘗試使用docker運行一個airflow鏡像。不久前,它還能正常作業。然而,我在沒有使用 docker 的情況下在 localhost 上運行了其他應用程式(使用 VisualStudio),之后當我重新運行我的 airflow 時,localhost 不再作業了。
我試著重新安裝Docker和AirFlow影像,但沒有成功。
我正在使用Apache網站上提供的Airflow 2.1.4 docker imagem。
我的AirFlow被設定為運行在localhost:8080。是否有辦法知道另一個應用程式是否在使用8080?
我不知道我可以在這里發布什么必要的資訊來澄清我的問題。我相信檢查是否有其他應用程式系結在localhost:8080上運行(無論是visual studio的一個實體還是docker本身)可以解決這個問題。但如何做到這一點呢?
我的docker-compose.yaml檔案:
# 許可給Apache軟體基金會(ASF),根據一個
# 或更多的貢獻者許可協議。 請參閱NOTICE檔案
# 與本作品一起分發,以獲得更多資訊
# 關于著作權所有權。 ASF根據Apache許可協議將此檔案
#根據Apache許可證,2.0版("許可證")向你授權。
# "許可證");除非遵守許可證的規定,否則你不得使用此檔案。
# 許可證。 你可以在以下網址獲得一份許可證的副本
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 除非適用法律要求或以書面形式同意。
#根據許可證分發的軟體是在一個
# "按原樣 "分發,沒有任何明示或暗示的保證或條件。
# 種類,無論是明示還是暗示。 請參閱許可證中的
# 許可證下的權限和限制的具體語言
#在許可證下。
#
# CeleryExecutor的基本Airflow集群配置,包括Redis和PostgreSQL。
#
# 警告:該配置是用于本地開發的。請不要在生產部署中使用它。
#
# 該配置支持使用環境變數或.env檔案進行基本配置
# 支持以下變數。
#
# AIRFLOW_IMAGE_NAME - 用于運行Airflow的Docker鏡像名稱。
# 默認:apache/airflow:2.1.4
# AIRFLOW_UID - Airflow容器中的用戶ID
# 默認值:50000
# AIRFLOW_GID - Airflow容器中的組ID
# 默認值:0
#
# 這些配置在獨立測驗/在測驗/試運行模式下運行Airflow的情況下非常有用
#
# _AIRFLOW_WWW_USER_USERNAME - 管理員賬戶的用戶名(如果要求的話)。
# 默認:airflow
# _AIRFLOW_WWW_USER_PASSWORD - 管理員賬戶的密碼(如果要求的話)。
# 默認為:airflow
# _PIP_ADDITIONAL_REQUIREMENTS - 啟動所有容器時要添加的額外PIP要求。
# 默認為:''
# 隨意修改這個檔案以適應你的需要。
---
版本。"3"
x-airflow-common: &airflow-common
# 為了添加自定義依賴或升級供應商軟體包,你可以使用你的擴展鏡像。
# 注釋鏡像行,將你的Docker檔案放在你放置docker-compose.yaml的目錄中
# 并取消注釋下面的 "build "行,然后運行`docker-compose build`來構建鏡像。
image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.1.4}。
# build: .
環境:&airflow-common-env
AIRFLOW__CORE__EXECUTOR: CeleryExecutor
AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql psycopg2://airflow:airflow@postgres/airflow
AIRFLOW__CELERY__RESULT_BACKEND: db postgresql://airflow:airflow@postgres/airflow
AIRFLOW__CELERY__BROKER_URL: redis://:@redis:6379/0
airflow__core__fernet_key: ""
AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION: "true"
airflow__core__load_examples: "true"。
AIRFLOW__API__AUTH_BACKEND: "airflow.api.ah.backend.basic_auth"
_pip_additional_requirements: ${_pip_additional_requirements:-}。
卷。
- ./dags:/opt/airflow/dags
- ./logs:/opt/airflow/logs
- ./plugins:/opt/airflow/plugins
用戶。"${AIRFLOW_UID:-50000}:${AIRFLOW_GID:-0}"
depends_on: &airflow-comm-depends-on
redis。
condition: service_healthy
postgres。
condition: service_healthy
服務。
postgres:
image: postgres:13
環境。
POSTGRES_USER: airflow
POSTGRES_PASSWORD: airflow
POSTGRES_DB: airflow
卷。
- postgres-db-volume:/var/lib/postgresql/data
健康檢查。
測驗。["CMD", "pg_isready", "-U", "airflow"]
間隔。5s
重試。5
重新啟動:總是
redis:
image: redis:latest
曝光。
- 6379
健康檢查。
測驗。["CMD", "redis-cli", "ping"]
間隔時間。5s
timeout: 30s
重試。50
重新啟動:總是
airflow-webserver。
<<。*airflow-common
命令:webserver
埠。
- 5000:8080
健康檢查。
測驗。["CMD", "curl", "--fail", "http://localhost:5000/health"]
間隔時間: 10s
超時。10s
重試。5
重新啟動: 總是
depends_on:
<<。*airflow-comm-depends-on
airflow-init:
條件:服務已完成_成功
airflow-scheduler:
<<: *氣流-共性
命令:調度器
健康檢查。
測驗。
[
"CMD-SHELL",
'airflow jobs check --job-type SchedulerJob --hostname "${HOSTNAME}',
]
間隔:10s
超時。10s
重試。5
重新啟動: 總是
depends_on:
<<。*airflow-comm-depends-on
airflow-init:
條件:服務已完成_成功
airflow-worker:
<<: *airflow-common
命令:Celery worker
健康檢查。
測驗。
- "CMD-SHELL"
- 'celery --app airflow.executors.celery_executor.app inspect ping -d "celery@$${HOSTNAME}"
間隔:10s
超時。10s
重試。5
環境。
<<。*airflow-comm-env
# 需要正確處理芹菜作業器的溫控關閉。
# 見 https://airflow.apache.org/docs/docker-stack/entrypoint.html#signal-propagation
dumb_init_setsid: "0"
重新啟動: 總是
depends_on:
<<。*airflow-common-depends-on
airflow-init:
條件:服務已完成_成功
氣流啟動。
<<: *氣流-共性
輸入點。/bin/bash
# yamllint disable rule:line-length
命令。
- -c
- |
function ver() {
printf "dddd" $${1//./ }
}
airflow_version=$$(gosu airflow airflow version)
airflow_version_comparable=$$(ver $${airflow_version})
min_airflow_version=2.1.0
min_airflow_version_comparable=$$(ver ${min_airflow_version})
如果((airflow_version_comparable < min_airflow_version_comparable ));那么
回聲
echo -e "33[1;31mERROR!!: 太老的Airflow版本${airflow_version}!e[0m"
echo "支持的最小Airflow版本。${min_airflow_version}。只能使用這個版本或更高的版本!"
回聲
退出 1
fi
if [[ -z "${AIRFLOW_UID}"]; then
echo
echo -e "33[1;33mWARNING!!: AIRFLOW_UID沒有設定!e[0m"
echo "如果你是在Linux上,你應該按照下面的指示來設定"
echo "AIRFLOW_UID和AIRFLOW_GID環境變數,否則檔案將被root擁有。"
echo "對于其他作業系統,你可以通過手動創建.env檔案來擺脫警告:"
echo " 參見:https://airflow.apache.org/docs/apache-airflow/stable/start/docker.html#setting-the-right-airflow-user"
echo
fi
one_meg=1048576
mem_available=$$(($$(getconf _PHYS_PAGES) * $$$(getconf PAGE_SIZE) / one_meg))
cpus_available=$$(grep -cE 'cpu[0-9] ' /proc/stat)
disk_available=$$(df / | tail -1 | awk '{print $$4}' )
warning_resources="false"
如果(( mem_available < 4000 )) ; 那么
回聲
echo -e "33[1;33mWARNING!!: 沒有足夠的記憶體供Docker.e[0m "使用。
echo "至少需要4GB的記憶體。你有$$(numfmt --to iec $$((mem_available * one_meg))"
echo
warning_resources="true"
fi
如果((cpus_available < 2 ));那么
回聲
echo -e "33[1;33mWARNING!!: 沒有足夠的CPUS可用于Docker.e[0m"
echo "建議至少使用2個CPU。你有${cpus_available}"
回聲
warning_resources="true"
fi
if (( disk_available < one_meg * 10 )); then
回聲
echo -e "33[1;33mWARNING!!: 沒有足夠的磁盤空間給Docker.e[0m"
echo "建議至少有10GB的空間。你有$$(numfmt --to iec $$((disk_available * 1024 ))"
echo
warning_resources="true"
fi
如果 [[ $${warning_resources} == "true"]; 那么
回聲
echo -e "33[1;33mWARNING!!: 你沒有足夠的資源來運行Airflow(見上文)!e[0m"
echo "請按照說明增加可用資源量:"
echo " https://airflow.apache.org/docs/apache-airflow/stable/start/docker.html#before-you-begin"
echo
fi
mkdir -p /sources/logs /sources/dags /sources/plugins
chown -R "${AIRFLOW_UID}:${AIRFLOW_GID}" /sources/{logs,dags,plugins}。
exec /entrypoint airflow version
# yamllint enable rule:line-length
環境。
<<。*airflow-comm-env
_AIRFLOW_DB_UPGRADE: "true"
_AIRFLOW_WWW_USER_CREATE: "true"
_AIRFLOW_WWW_USER_USERNAME: ${_AIRFLOW_WWW_USER_USERNAME:-airflow}。
_AIRFLOW_WWW_USER_PASSWORD: ${_AIRFLOW_WWW_USER_PASSWORD:-airflow}。
用戶。"0:${AIRFLOW_GID:-0}"
卷。
- .:/sources
airflow-cli:
<<。*airflow-common
組態檔。
- debug
環境。
<<: *airflow-comm-env
connection_check_max_count: "0"
# 入口問題的解決方法。參見:https://github.com/apache/airflow/issues/16252
命令。
- bash
- -c
- 氣流
花。
<<。*airflow-common
命令: celery flower
埠。
- 5555:5555
健康檢查。
測驗。["CMD", "curl", "--fail", "http://localhost:5555/"]
間隔時間: 10s
timeout: 10s
重試。5
重新啟動: 總是
depends_on:
<<。*airflow-comm-depends-on
airflow-init:
條件:服務已成功完成
卷。
postgres-db-volume。
我的airflow webserver日志:
airflow-webserver_1 | ....................
airflow-webserver_1 | ERROR! 達到最大重試次數(20)。
錯!達到了最大的重試次數(20次)。
airflow-webserver_1 | 最后一次檢查結果。
airflow-webserver_1 | $ airflow db check
airflow-webserver_1 | 無法加載配置,包含一個配置錯誤。
airflow-webserver_1 | 回溯(最近一次呼叫)。
airflow-webserver_1 | 檔案 "/usr/local/lib/python3.6/pathlib.py", 第1248行, in mkdir
airflow-webserver_1 | self._accessor.mkdir(self, mode)
檔案"/usr/local/lib/python3.6/pathlib.py", 第387行, in wrapped
airflow-webserver_1 | return strfunc(str(pathobj), *args)
airflow-webserver_1 | FileNotFoundError: [Errno 2] 沒有這樣的檔案或目錄:'/opt/airflow/logs/scheduler/2021-09-20'
呼叫中心: 呼叫中心: 呼叫中心: 呼叫中心: 呼叫中心: 呼叫中心: 呼叫中心: 呼叫中心: 呼叫中心
airflow-webserver_1 | 在處理上述例外時,發生了另一個例外。
airflow-webserver_1 |
airflow-webserver_1 | 回溯(最近一次呼叫)。
檔案 "/usr/local/lib/python3.6/logging/config.py", 第565行, in configure
airflow-webserver_1 | handler = self.configure_handler(handlers[name])
檔案"/usr/local/lib/python3.6/logging/config.py",第738行,in configure_handler
airflow-webserver_1 | result = factory(**kwargs)
airflow-webserver_1 | 檔案 "/home/airflow/.local/lib/python3.6/Site-packages/airflow/utils/log/file_processor_handler.py", 第47行, in __init__
airflow-webserver_1 | Path(self._get_log_directory()).mkdir(parents=True, exist_ok=True)
檔案 "/usr/local/lib/python3.6/pathlib.py", 第1252行, in mkdir
airflow-webserver_1 | self.parent.mkdir(parents=True, exist_ok=True)
airflow-webserver_1 | 檔案 "/usr/local/lib/python3.6/pathlib.py", 第1248行, in mkdir
airflow-webserver_1 | self._accessor.mkdir(self, mode)
檔案"/usr/local/lib/python3.6/pathlib.py", 第387行, in wrapped
airflow-webserver_1 | return strfunc(str(pathobj), *args)
airflow-webserver_1 | PermissionError: [Errno 13] 拒絕許可:'/opt/airflow/logs/scheduler'。
流程圖
airflow-webserver_1 | 在處理上述例外時,發生了另一個例外。
例外處理程序中,發生了另一個例外:airflow-webserver_1 |
airflow-webserver_1 | 回溯(最近一次呼叫)。
檔案"/home/airflow/.local/bin/airflow",第5行,在<module>。
airflow-webserver_1 | from airflow.__main__ import main
檔案"/home/airflow/.local/lib/python3.6/Site-packages/airflow/__init__.py", 第46行, in <module>
airflow-webserver_1 | settings.initialize()
檔案"/home/airflow/.local/lib/python3.6/Site-packages/airflow/settings.py", 第444行, in initialize
airflow-webserver_1 | LOGGING_CLASS_PATH = configure_logging()
檔案"/home/airflow/.local/lib/python3.6/site-packages/airflow/logging_config.py",第73行,in configure_logging
airflow-webserver_1 | raise e
腳本檔案"/home/airflow/.local/lib/python3.6/Site-packages/airflow/logging_config.py",第68行,in configure_logging
airflow-webserver_1 | dictConfig(logging_config)
檔案"/usr/local/lib/python3.6/logging/config.py",第802行, in dictConfig
airflow-webserver_1 | dictConfigClass(config).configure()
檔案"/usr/local/lib/python3.6/logging/config.py", 第573行, in configure
airflow-webserver_1 | '%r: %s' % (name, e))
Airflow-webserver_1 | ValueError: 無法配置處理程式'處理器'。[Errno 13] 權限被拒絕:'/opt/airflow/logs/scheduler'。
airflow-webserver_1 |
airflow-webserver_1退出了,代碼為1
我在windows 10上使用Docker desktop。
我的docker容器-ps的螢屏顯示,localhost被系結在8080運行不健康
編輯:
uj5u.com熱心網友回復:
要檢查所有已經在docker中運行的容器,你可以運行下面的命令,檢查是否有人在使用8080埠:
docker container ls
通常情況下,所有與網路開發有關的東西都默認部署在80/8080/443/8443上,所以這里最好的解決方法是將你的docker容器的埠系結改為與8080不同的埠。
如果你使用 "docker "命令,你會看到類似"-p local_port:container_port "的選項,你可以為 "local_port "設定另一個埠,以便不把容器8080系結到你的本地8080。這樣,你就可以讓一切都運行起來了
。為了幫助你,我們至少需要你的作業系統向你發送一個有效的命令,以檢查你是否有任何使用8080埠的行程,以及你如何喚醒你的docker鏡像(引數、命令、docker-compose...)
uj5u.com熱心網友回復:
你的服務器的日志顯示
FileNotFoundError: [Errno 2] 沒有這樣的檔案或目錄。 '/opt/airflow/logs/scheduler/2021-09-20'
而且
PermissionError: [Errno 13] 權限被拒絕。 '/opt/airflow/logs/scheduler'
。
你的編譯檔案包含
卷。
- ./dags:/opt/airflow/dags
- ./logs:/opt/airflow/logs
- ./plugins:/opt/airflow/plugins
用戶。"${AIRFLOW_UID:-50000}:${AIRFLOW_GID:-0}"
這意味著你所有的容器都在共享你主機上的幾個檔案夾,并且以環境變數AIRFLOW_UID的任何用戶身份運行。可能發生了兩件事中的一件--
chown。這可能就是問題所在。特別是dags檔案夾,幾乎可以肯定是由你的個人用戶擁有的,uid 50000將沒有權限讀取這些檔案。如果這些檔案是由50000擁有的,你就不能自己對它們進行錄音。對于本地作業,我建議在運行這些命令時,將AIRFLOW_UID設定為你的用戶ID--比如AIRFLOW_UID=$(id -u) docker-compose up。
現在... 我不在Windows上開發,而且我知道我剛才給你的那句話在Windows上是行不通的,而且檔案系統的權限在docker-desktop上是不同的,甚至在不同的版本之間也是如此。但你的問題將歸結于那些共享的系結掛載檔案夾的權限。
uj5u.com熱心網友回復:
我使用下面的命令來檢查容器的健康日志:
docker.com
docker inspect --format='{{json .State.Health}}' dags_airflow-webserver_1
是向我顯示了錯誤:
0curl。(7) 連接到本地主機5000埠失敗:連接被拒絕
"
我在StackOverflow上搜索了一下,發現了Sammue問題這里
為了解決這個問題,我所做的是以VSCode和Docker Desktop的身份運行Administrator
。轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/326372.html
標籤:
上一篇:gradle構建鏡像,使用與docker檔案中提到的不同的版本
下一篇:移除谷歌容器作業系統的舊容器


