我的 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()
它与以下简单的docker文件一起
FROM python:3.9
ADD main.py .
RUN pip install numpy
CMD ["python", "./main.py"]
我可以用< code > docker build-t docker-test-image创建我的映像。使用< code > docker run-name docker-test-container docker-test-image 从CLI运行此命令,将得到预期的输出:
Hello World
[[0.20923763 0.25415024 0.95603957]
[0.01320074 0.58392589 0.24175036]
[0.06431375 0.87276564 0.9912474 ]]
到目前为止还不错,但是如果我用docker操作员触发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
在仔细研究了一下之后,我认为这是一个Docker-in-Docker问题,最有可能的解决方案是在本教程中找到的。我添加了-/var/run/docker.sock:/var/run/docker。sock</code>添加到我的airflow docker compose文件中的volumes部分。否,DAG仍然失败,并出现以下日志错误:
回溯(最近一次调用):文件“/home/arflow/.local/lib/python3.7/site-packages/requests/adapters.py”,第450行,在发送超时=超时文件“/hame/arflows/.local/lib/ppython3.7/site-packages/urllib3/connectionpool.py”中,第786行,在urlopen方法中,url,error=e,_pool=self,_stacktrace=sys。exc_info()2文件“/home/arflow/.local/lib/python3.7/site-packages/urllib3/util/retry.py”,第550行,增量增加6。reraise(type(error),error,_stacktrace)文件“/home/afflow/.local/lib/python3.7/site-packages/urllib3/packages/six.py”,第769行,在reraise-raise提升值中。with_traceback(tb)文件“/home/arflow/.local/lib/python3.7/site packages/urllib3/connectionpool.py”,第710行,位于urlopen chunked=chunked中,文件“/hame/arflows/.local/lib/ppython3.7/site packages/urllib3/onnectionpool.py”第398行,位于_make_request conn.request(方法,url,**httplib_request_kw)文件“/usr/local/lib/python3.7/http/client.py”的第1281行,位于请求自身中_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_chonked)文件“/usr/local/lib/python3.7/http/client.py”,第1276行,位于endheaders-self中_send_output(message_body,encode_chunked=encode_chonked)文件“/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/arflow/.local/lib/python3.7/site packages/docker/transport/unixconn.py”,第30行,位于connect sock.connect(self.unix_socket)urllib3.exceptions中。ProtocolError:(“连接已中止。”,PermissionError(13,“权限被拒绝”))
在处理上述异常期间,发生了另一个异常:
回溯(最近一次调用的最后一次):文件“/home/arflow/.local/lib/python3.7/site-packages/docker/api/client.py”,第214行,在_retrieve_server_version中返回self。version(api_version=False)[“ApiVersion”]文件“/home/arflow/.local/lib/python3.7/site-packages/docker/api/demon.py”,第181行,在版本中返回self._result(self_get(url),json=True)文件“/hame/arflows/.local/python370/site-ppackages/docker/utils/decorators.py”,第46行,在内部返回f(self,*args,**kwargs)文件“.home/arfrow/.llocal/lib/python3.7/site-packges/docker/api/client.py”,第237行,在_get return self中。get(url,**self.set_request_timeout(kwargs))文件“/home/arflow/.local/lib/python3.7/site-packages/requests/sessions.py”,第542行,在get-return-self中。request('GET',url,**kwargs)文件“/home/arflow/.local/lib/python3.7/site-packages/requests/sessions.py”,第529行,在request resp=self中。send(prep,**send_kwargs)文件“/home/arflow/.local/lib/python3.7/site-packages/requests/sessions.py”,第645行,在send r=适配器中。send(request,**kwargs)文件“/home/arflow/.local/lib/python3.7/site packages/requests/adapters.py”,第501行,在send-raise ConnectionError(err,request=request)requests.exceptions中。ConnectionError:(“连接已中止。”,PermissionError(13,“权限被拒绝”))
在处理上述异常期间,发生了另一个异常:
回溯(最近一次调用):文件 “/home/airflow/.local/lib/python3.7/site-packages/airflow/providers/docker/operator/docker.py”,第 360 行,在 execute self.cli = self._get_cli() 文件 “/home/airflow/.local/lib/python3.7/site-packages/airflow/providers/docker/operator/docker.py”,第 390 行,_get_cli返回 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-compse文件中,而不是
- /var/run/docker.sock:/var/run/docker.sock
在 Windows 机器上使用它:
- //var/run/docker.sock:/var/run/docker.sock
小变化,我想大影响。
我正在评估我当前的气流部署从Celery executor到Kubernetes(K8s)executor的迁移,以利用Pods提供的资源动态分配和任务隔离。 我很清楚,我们可以使用本机的KubernetesPodOperator通过K8s Executor在K8s集群上运行任务。但是,我找不到关于K8s executor与其他操作符(如bash和Athena)之间兼容性的信息。 这里的问题是,是
问题内容: 我正在研究Centos7。我有一个运行Jenkins的Docker容器。在那个Jenkins容器中,我必须构建并运行其他Docker容器。但是詹金斯不认识码头工人。我能够执行一个shell并将docker安装在容器中。但是,是否有可能让容器在主机上使用我的docker- engine?如何使用? 在Jenkins-(docker)-容器中安装Docker的最佳选择是什么? 问题答案:
问题内容: 我试图在docker容器中运行cron作业 但对我没有用 我的容器只有cron.daily和cron.weekly文件 crontab,cron.d,cron.hourly …在我的容器中不存在 crontab -e也无法正常工作 我的容器使用/ bin / bash运行 问题答案: 这是我运行我的cron容器之一的方法。 Dockerfile: crontab.txt entry.s
问题内容: 我正在尝试在调用shell脚本的docker容器中运行cronjob。 昨天我一直在网上搜索和堆栈溢出,但是我找不到真正可行的解决方案。 我怎样才能做到这一点? 编辑: 我已经创建了一个(带注释的)github存储库,上面有一个工作的docker cron容器,该容器以给定的时间间隔调用shell脚本。 问题答案: 您可以将crontab复制到映像中,以使从该映像启动的容器运行该作业。
我创建了一个(有注释的)github存储库,其中有一个工作的docker cron容器,它以给定的时间间隔调用一个shell脚本。
只有当docker容器尚未运行时,我才需要运行它。给了这个命令。如果它不存在,我将如何运行它。 我对任何脚本或语言都持开放态度。