【问题标题】:Airflow: DockerOperator fails with Permission Denied error气流:DockerOperator 失败并出现 Permission Denied 错误
【发布时间】:2020-06-21 14:06:22
【问题描述】:

我正在尝试通过 Airflow 运行 docker 容器,但出现 Permission Denied 错误。我看过一些相关的帖子,有些人似乎已经通过sudo chmod 777 /var/run/docker.sock 解决了这个问题,这充其量是一个有问题的解决方案,但它仍然对我不起作用(即使在重新启动 docker 之后。如果有人设法解决了这个问题,请告诉我!

这是我的 DAG:

from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.docker_operator import DockerOperator

args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2020, 6, 21, 11, 45, 0),
    'retries': 1,
    'retry_delay': timedelta(minutes=1),
}

dag = DAG(
    "docker",
    default_args=args,
    max_active_runs=1,
    schedule_interval='* * * * *',
    catchup=False
)

hello_operator = DockerOperator(
    task_id="run_docker",
    image="alpine:latest",
    command="/bin/bash echo HI!",
    auto_remove=True,
    dag=dag
)

这是我得到的错误:

[2020-06-21 14:01:36,620] {taskinstance.py:1145} ERROR - ('Connection aborted.', PermissionError(13, 'Permission denied'))
Traceback (most recent call last):
  File "/home/airflow/.local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 672, in urlopen
    chunked=chunked,
  File "/home/airflow/.local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 387, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/local/lib/python3.6/http/client.py", line 1262, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/local/lib/python3.6/http/client.py", line 1308, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/local/lib/python3.6/http/client.py", line 1257, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/local/lib/python3.6/http/client.py", line 1036, in _send_output
    self.send(msg)
  File "/usr/local/lib/python3.6/http/client.py", line 974, in send
    self.connect()
  File "/home/airflow/.local/lib/python3.6/site-packages/docker/transport/unixconn.py", line 43, in connect
    sock.connect(self.unix_socket)
PermissionError: [Errno 13] Permission denied

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/airflow/.local/lib/python3.6/site-packages/requests/adapters.py", line 449, in send
    timeout=timeout
  File "/home/airflow/.local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 720, in urlopen
    method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
  File "/home/airflow/.local/lib/python3.6/site-packages/urllib3/util/retry.py", line 400, in increment
    raise six.reraise(type(error), error, _stacktrace)
  File "/home/airflow/.local/lib/python3.6/site-packages/urllib3/packages/six.py", line 734, in reraise
    raise value.with_traceback(tb)
  File "/home/airflow/.local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 672, in urlopen
    chunked=chunked,
  File "/home/airflow/.local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 387, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/local/lib/python3.6/http/client.py", line 1262, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/local/lib/python3.6/http/client.py", line 1308, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/local/lib/python3.6/http/client.py", line 1257, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/local/lib/python3.6/http/client.py", line 1036, in _send_output
    self.send(msg)
  File "/usr/local/lib/python3.6/http/client.py", line 974, in send
    self.connect()
  File "/home/airflow/.local/lib/python3.6/site-packages/docker/transport/unixconn.py", line 43, in connect
    sock.connect(self.unix_socket)
urllib3.exceptions.ProtocolError: ('Connection aborted.', PermissionError(13, 'Permission denied'))

这是我的设置:

Dockerfile:

FROM apache/airflow
RUN pip install --upgrade --user pip && \
    pip install --user psycopg2-binary && \
    pip install --user docker
COPY airflow/airflow.cfg /opt/airflow/

docker-compose.yaml:

version: "3"

services:

  postgres:
    image: "postgres:9.6"
    container_name: "postgres"
    environment:
      - POSTGRES_USER=airflow
      - POSTGRES_PASSWORD=airflow
      - POSTGRES_DB=airflow
    ports:
    - "5432:5432"
    volumes:
    - ./data/postgres:/var/lib/postgresql/data

  initdb:
    image: learning/airflow
    entrypoint: airflow initdb
    depends_on:
      - postgres

  webserver:
    image: learning/airflow
    restart: always
    entrypoint: airflow webserver
    environment:
      - EXECUTOR=Local
    healthcheck:
      test: ["CMD-SHELL", "[ -f /opt/airflow/airflow-webserver.pid ]"]
      interval: 1m
      timeout: 5m
      retries: 3
    ports:
      - "8080:8080"
    depends_on:
      - postgres
    volumes:
    - ./airflow/dags:/opt/airflow/dags
    - ./airflow/plugins:/opt/airflow/plugins
    - ./data/logs:/opt/airflow/logs
    - /var/run/docker.sock:/var/run/docker.sock

  scheduler:
    image: learning/airflow
    restart: always
    entrypoint: airflow scheduler
    healthcheck:
      test: ["CMD-SHELL", "[ -f /opt/airflow/airflow-scheduler.pid ]"]
      interval: 1m
      timeout: 5m
      retries: 3
    depends_on:
      - postgres
    volumes:
      - ./airflow/dags:/opt/airflow/dags
      - ./airflow/plugins:/opt/airflow/plugins
      - ./data/logs:/opt/airflow/logs
      - /var/run/docker.sock:/var/run/docker.sock

【问题讨论】:

  • 你找到解决方案了吗?

标签: docker airflow


【解决方案1】:

我使用 puckel 映像在 Windows(开发环境)上遇到了这个问题。 请注意,此图像上不存在文件 /var/run/docker.sock,我创建了它并将所有者更改为 puckel 图像中已存在的 airflow 用户

RUN touch /var/run/docker.sock
RUN chown -R airflow /var/run/docker.sock

【讨论】:

    【解决方案2】:

    如果卷已经映射到容器,在主机上运行 chmod:

    chmod 777 /var/run/docker.sock
    

    为我解决了。

    【讨论】:

      【解决方案3】:

      您可以尝试使用以下命令运行 docker 文件:

      docker run -v /var/run/docker.sock:/var/run/docker.sock your_image_name
      

      【讨论】:

        【解决方案4】:

        我记得遇到过类似的问题,除了您已经完成的工作之外,我所做的是在像这样的启动脚本中使用docker.sock 的 GID 在容器中动态添加 docker 组:

        #!/usr/bin/env bash
        ARGS=$*
        
        # Check if docker sock is mounted
        if [[ -S /var/run/docker.sock ]];
        then
            GROUP=`stat -c %g /var/run/docker.sock`
            groupadd -g $GROUP docker
            usermod -aG docker airflow
        else
            echo "Docker unix sock not found. DockerOperators will not run."
        fi
        
        su airflow -c "/usr/bin/dumb-init -- /entrypoint $ARGS"
        

        这样您就不会触及套接字的权限,并且气流用户仍然能够与之交互。

        其他一些注意事项:

        • 我必须在 Dockerfile 中重新声明默认用户才能以 root 开头
        • 以用户airflow 运行气流

        【讨论】:

          【解决方案5】:

          即使知道这个问题很老,我的回答仍然可以帮助其他遇到这个问题的人。

          我在以下链接中找到了一个优雅(且实用)的解决方案:

          https://onedevblog.com/how-to-fix-a-permission-denied-when-using-dockeroperator-in-airflow/

          引用文章:

          还有一种更优雅的方法,包括将文件“包装”在服务周围(可通过 TCP 访问)。

          【讨论】:

            【解决方案6】:

            在volumes中添加另一个前导/到/var/run/docker.sock(在:之前的部分),如下:

            volumes:
                //var/run/docker.sock:/var/run/docker.sock
            

            【讨论】:

            • 感谢您的建议!不幸的是,它似乎没有帮助。我也尝试在冒号后添加和额外的 /,但它也有帮助。
            • 这个“//”是在medium.com/analytics-vidhya/…medium.com/analytics-vidhya/…中查看更多内容
            • 没有描述,为什么这可能会有所帮助。如果您要提供答案,请考虑添加解释。
            【解决方案7】:

            在我的情况下,命令帮助之前的“sudo” - 我运行

            sudo docker-compose up -d --build dev
            

            而不是

            docker-compose up -d --build dev
            

            它有帮助。问题是缺乏权利。

            【讨论】:

              【解决方案8】:

              试试

              $sudo groupadd docker 
              
              $sudo usermod -aG docker $USER
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-02-12
                • 2021-11-12
                • 1970-01-01
                • 1970-01-01
                • 2014-07-31
                • 1970-01-01
                相关资源
                最近更新 更多