我正在尝试在 Airflow 中使用 DockerOperator 来运行容器。
当 dag 运行时,我收到以下错误
2021-05-12 18:45:59,417] {taskinstance.py:1128} ERROR - Error while fetching server API version: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))
Traceback (most recent call last):
File "/home/airflow/.local/lib/python3.8/site-packages/urllib3/connectionpool.py", line 670, in urlopen
httplib_response = self._make_request(
File "/home/airflow/.local/lib/python3.8/site-packages/urllib3/connectionpool.py", line 392, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/usr/lib/python3.8/http/client.py", line 1255, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/lib/python3.8/http/client.py", line 1301, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/usr/lib/python3.8/http/client.py", line 1250, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/usr/lib/python3.8/http/client.py", line 1010, in _send_output
self.send(msg)
File "/usr/lib/python3.8/http/client.py", line 950, in send
self.connect()
File "/home/airflow/.local/lib/python3.8/site-packages/docker/transport/unixconn.py", line 43, in connect
sock.connect(self.unix_socket)
FileNotFoundError: [Errno 2] No such file or directory
图像存储在 AWS ECR 中。我使用以下命令为 ecr 生成密码:
aws ecr get-login-password --region <region-name>
我的任务的配置如下:
- 变量和默认参数
docker_conn_string = "DOCKER_HUB_CONNECTION_STRING"
docker_hub_url = Variable.get("DOCKER_HUB_URL")
docker_image = docker_hub_url + '/image-name'
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'retry_delay': timedelta(minutes=1),
"max_active_runs": 1,
"retries": 0
}
- 有向无环图
dag = DAG(
'do_some_work',
default_args = default_args,
schedule_interval = "0 0 * * *",
catchup = False,
)
- 码头工人
run_image = DockerOperator(
api_version = 'auto',
docker_conn_id = docker_conn_string,
auto_remove = True,
# force_pull = True,
command = 'command to be run',
image = docker_image,
task_id = 'do_work',
dag = dag,
start_date = datetime(2021, 5, 5)
)
我尝试过的事情,
- 重新检查连接字符串以使用 https 和 tcp
- 1.21版本前后手动添加docker版本
- 当我使用 docker 登录凭据运行 docker pull 时,可以拉取图像,因此 EMR 密码不是问题
- 当我在本地气流实例中运行它时,如果图像已经在本地下载,它就可以工作
我的评估是,在拉取 docker 操作员用来确定 docker 版本的图像之前还有额外的 api,这是失败的原因,因此无法拉取图像。我认为这可能与某些 ECR 设置有关。
这里的任何帮助将不胜感激。
谢谢