Rol*_*ain 1 python docker docker-compose airflow
我的 Windows 机器上运行着一个 docker 容器,它是使用官方文档中提供的 docker-compose 文件的改编版本构建的。
这工作正常,但是我想将 python 脚本(这是我的任务)从已安装的plugins
文件夹移到它们自己的 docker 容器中。
为了测试这一点,我创建了一个简单的“Hello World!” 示例脚本:
import numpy as np
def main():
print(f'Hello World')
print(np.random.random((3, 3)))
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
与以下简单的 docker 文件一起
FROM python:3.9
ADD main.py .
RUN pip install numpy
CMD ["python", "./main.py"]
Run Code Online (Sandbox Code Playgroud)
docker build -t docker-test-image .
我可以使用 CLI创建图像,运行它docker run --name docker-test-container docker-test-image
会得到预期的输出:
Hello World
[[0.20923763 0.25415024 0.95603957]
[0.01320074 0.58392589 0.24175036]
[0.06431375 0.87276564 0.9912474 ]]
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,但是如果我用我的 docker-operator 触发 DAG,它就会失败,并且我会得到几个
FileNotFoundError: [Errno 2] 日志中没有此类文件或目录错误。
我的 DAG 脚本如下所示:
from airflow import DAG
from airflow.utils.dates import days_ago
from airflow.providers.docker.operators.docker import DockerOperator
from datetime import timedelta
with DAG(
dag_id= 'docker_test_dag',
description='Testing the docker operator',
schedule_interval=None,
start_date=days_ago(2),
catchup=False,
tags=['docker_test'],
default_args={
'owner': 'airflow',
'email': ['airflow@example.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 0,
'depends_on_past': False,
'retry_delay': timedelta(minutes=5)
}
) as dag:
docker_test_task = DockerOperator(
task_id='docker_test_task',
image='docker-test-image',
api_version='auto',
auto_remove=True,
mount_tmp_dir=False,
container_name='docker-test-container',
command='echo "this is a test message shown from within the container',
docker_url='unix://var/run/docker.sock',
network_mode='bridge'
)
docker_test_task
Run Code Online (Sandbox Code Playgroud)
经过一番研究后,我认为这是一个 Docker-in-Docker 问题,最有可能的解决方案是在本教程中找到的。我添加- /var/run/docker.sock:/var/run/docker.sock
到了气流 docker-compose 文件中的volumes部分。否,DAG 仍然失败,并出现以下日志错误:
回溯(最近一次调用最后):文件“/home/airflow/.local/lib/python3.7/site-packages/requests/adapters.py”,第450行,发送超时=超时文件“/home/airflow/ .local/lib/python3.7/site-packages/urllib3/connectionpool.py”,第786行,在urlopen方法中,url,error=e,_pool=self,_stacktrace=sys.exc_info() 2 文件“/home/ airflow/.local/lib/python3.7/site-packages/urllib3/util/retry.py”,第 550 行,增量提高 6.reraise(type(error), error, _stacktrace) 文件“/home/airflow/ .local/lib/python3.7/site-packages/urllib3/packages/six.py”,第 769 行,在 reraise 中提高 value.with_traceback(tb) 文件“/home/airflow/.local/lib/python3.7/ site-packages/urllib3/connectionpool.py”,第 710 行,在 urlopen chunked=chunked,文件“/home/airflow/.local/lib/python3.7/site-packages/urllib3/connectionpool.py”,第 398 行,在 _make_request conn.request(method, url, **httplib_request_kw) 文件“/usr/local/lib/python3.7/http/client.py”,第 1281 行,在请求 self._send_request(method, url, body, headers ,encode_chunked)文件“/usr/local/lib/python3.7/http/client.py”,第1327行,在_send_request self.endheaders(body,encode_chunked=encode_chunked)文件“/usr/local/lib/python3.7 /http/client.py”,第 1276 行,在 endheaders self._send_output(message_body,encode_chunked=encode_chunked) 文件“/usr/local/lib/python3.7/http/client.py”,第 1036 行,在 _send_output self. send(msg) 文件“/usr/local/lib/python3.7/http/client.py”,第 976 行,在 send self.connect() 文件“/home/airflow/.local/lib/python3.7/ site-packages/docker/transport/unixconn.py”,第 30 行,连接 sock.connect(self.unix_socket) urllib3.exceptions.ProtocolError: ('连接中止。', PermissionError(13, '权限被拒绝'))
在处理上述异常的过程中,又出现了一个异常:
回溯(最近一次调用最后一次):文件“/home/airflow/.local/lib/python3.7/site-packages/docker/api/client.py”,第 214 行,在 _retrieve_server_version 返回 self.version(api_version=False )["ApiVersion"] 文件“/home/airflow/.local/lib/python3.7/site-packages/docker/api/daemon.py”,第 181 行,版本返回 self._result(self._get(url ), json=True) 文件“/home/airflow/.local/lib/python3.7/site-packages/docker/utils/decorators.py”,第 46 行,内部返回 f(self, *args, ** kwargs) 文件“/home/airflow/.local/lib/python3.7/site-packages/docker/api/client.py”,第 237 行,在 _get return self.get(url, **self._set_request_timeout(kwargs )) 文件“/home/airflow/.local/lib/python3.7/site-packages/requests/sessions.py”,第 542 行,在 get return self.request('GET', url, **kwargs) 文件中“/home/airflow/.local/lib/python3.7/site-packages/requests/sessions.py”,第 529 行,请求 resp = self.send(prep, **send_kwargs) 文件“/home/airflow/ .local/lib/python3.7/site-packages/requests/sessions.py”,第 645 行,发送 r = adapter.send(request, **kwargs) 文件“/home/airflow/.local/lib/python3 .7/site-packages/requests/adapters.py",第 501 行,在发送中引发 ConnectionError(err, request=request) requests.exceptions.ConnectionError: ('连接中止。', PermissionError(13, '权限被拒绝') )
在处理上述异常的过程中,又出现了一个异常:
回溯(最近一次调用最后一次):文件“/home/airflow/.local/lib/python3.7/site-packages/airflow/providers/docker/operators/docker.py”,第 360 行,在执行 self.cli = self._get_cli() 文件“/home/airflow/.local/lib/python3.7/site-packages/airflow/providers/docker/operators/docker.py”,第 390 行,在 _get_cli return APIClient(base_url=self. docker_url, version=self.api_version, tls=tls_config) 文件“/home/airflow/.local/lib/python3.7/site-packages/docker/api/client.py”,第 197 行,init self._version = self._retrieve_server_version() 文件“/home/airflow/.local/lib/python3.7/site-packages/docker/api/client.py”,第 222 行,在 _retrieve_server_version f'获取服务器 API 版本时出错:{e }' docker.errors.DockerException:获取服务器 API 版本时出错:('连接中止。',PermissionError(13,'权限被拒绝'))
这应该怎么做?
终于找到答案了:
在 docker-compose 文件中而不是
- /var/run/docker.sock:/var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
在 Windows 机器上使用它:
- //var/run/docker.sock:/var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
小改变,大影响我想..
归档时间: |
|
查看次数: |
2603 次 |
最近记录: |