We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
The docker_list parser is raising ValueError exceptions in production.
The DockerList parser is throwing a number of the exception ValueError("Line containing 'REPOSITORY' was not found in table",), and ValueError("Line containing 'CONTAINER' was not found in table",) in production.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `insights/parsers/docker_list.py`
Content:
```
1 """
2 DockerList - command ``/usr/bin/docker (images|ps)``
3 ====================================================
4 
5 Parse the output of command "docker_list_images" and "docker_list_containers",
6 which have very similar formats.
7 
8 The header line is parsed and used as the names for the remaining columns.
9 All fields in both header and data are assumed to be separated by at least
10 three spaces.  This allows single spaces in values and headers, so headers
11 such as 'IMAGE ID' are captured as is.
12 
13 If the header line and at least one data line are not found, no data is
14 stored.
15 
16 Each row is stored as a dictionary, keyed on the header fields.  The data is
17 available in two formats:
18 
19 * The old format is a list of row dictionaries.
20 * The new format stores each dictionary in a dictionary keyed on the value of
21   a given field, given by the subclass.
22 
23 """
24 from insights import CommandParser, parser
25 from insights.parsers import SkipException, parse_fixed_table
26 from insights.specs import Specs
27 
28 
29 class DockerList(CommandParser):
30     """
31     A general class for parsing tabular docker list information.  Parsing
32     rules are:
33 
34     * The first line is the header line.
35     * The other lines are data lines.
36     * All fields line up vertically.
37     * Fields are separated from each other by at least three spaces.
38     * Some fields can contain nothing, and this is shown as spaces, so we
39       need to catch that and turn it into None.
40 
41     Why not just use hard-coded fields and columns?  So that we can adapt to
42     different output lists.
43 
44     Raises:
45         NotImplementedError: If `key_field` or `attr_name` is not defined
46         SkipException: If no data to parse
47     """
48     key_field = None
49     heading_ignore = []
50     attr_name = ''
51     substitutions = []
52 
53     def parse_content(self, content):
54         """
55         Parse the lines given into a list of dictionaries for each row.  This
56         is stored in the ``rows`` attribute.
57 
58         If the ``key_field`` property is set, use this to key a ``data``
59         dictionary attribute.
60         """
61         if not (self.key_field and self.attr_name):
62             raise NotImplementedError("'key_field' or 'attr_name' is not defined")
63 
64         self.rows = parse_fixed_table(content,
65                                       heading_ignore=self.heading_ignore,
66                                       header_substitute=self.substitutions)
67 
68         if not self.rows:
69             raise SkipException('No data.')
70 
71         data = {}
72         for row in self.rows:
73             k = row.get(self.key_field)
74             for sub in self.substitutions:
75                 row[sub[0]] = row.pop(sub[1]) if sub[1] in row else None
76             if k is not None and k != '<none>':
77                 data[k] = row
78         setattr(self, self.attr_name, data)
79 
80 
81 @parser(Specs.docker_list_images)
82 class DockerListImages(DockerList):
83     """
84     Handle the list of docker images using the DockerList parser class.
85 
86     Sample output of command ``docker images --all --no-trunc --digests``::
87 
88         REPOSITORY                           TAG                 DIGEST              IMAGE ID                                                           CREATED             VIRTUAL SIZE
89         rhel7_imagemagick                    latest              <none>              882ab98aae5394aebe91fe6d8a4297fa0387c3cfd421b2d892bddf218ac373b2   4 days ago          785.4 MB
90         rhel6_nss-softokn                    latest              <none>              dd87dad2c7841a19263ae2dc96d32c501ee84a92f56aed75bb67f57efe4e48b5   5 days ago          449.7 MB
91 
92     Attributes:
93         rows (list): List of row dictionaries.
94         images (dict): Dictionary keyed on the value of the "REPOSITORY" fileld
95 
96     Examples:
97         >>> images.rows[0]['REPOSITORY']
98         'rhel6_vsftpd'
99         >>> images.rows[1]['VIRTUAL SIZE']
100         '785.4 MB'
101         >>> images.images['rhel6_vsftpd']['CREATED']
102         '37 minutes ago'
103     """
104     key_field = 'REPOSITORY'
105     heading_ignore = [key_field]
106     attr_name = 'images'
107     substitutions = [("IMAGE ID", "IMAGE_ID"), ("VIRTUAL SIZE", "VIRTUAL_SIZE")]
108 
109     @property
110     def data(self):
111         return self.images
112 
113 
114 @parser(Specs.docker_list_containers)
115 class DockerListContainers(DockerList):
116     """
117     Handle the list of docker images using the DockerList parser class.
118 
119     Sample output of command ``docker ps --all --no-trunc --size``::
120 
121         CONTAINER ID                                                       IMAGE                                                              COMMAND                                            CREATED             STATUS                        PORTS                  NAMES               SIZE
122         95516ea08b565e37e2a4bca3333af40a240c368131b77276da8dec629b7fe102   bd8638c869ea40a9269d87e9af6741574562af9ee013e03ac2745fb5f59e2478   "/bin/sh -c 'yum install -y vsftpd-2.2.2-6.el6'"   51 minutes ago      Exited (137) 50 minutes ago                          tender_rosalind     4.751 MB (virtual 200.4 MB)
123         03e2861336a76e29155836113ff6560cb70780c32f95062642993b2b3d0fc216   rhel7_httpd                                                        "/usr/sbin/httpd -DFOREGROUND"                     45 seconds ago      Up 37 seconds                 0.0.0.0:8080->80/tcp   angry_saha          796 B (virtual 669.2 MB)
124 
125     Attributes:
126         rows (list): List of row dictionaries.
127         containers(dict): Dictionary keyed on the value of the "NAMES" field
128 
129     Examples:
130         >>> containers.rows[0]['STATUS']
131         'Up 37 seconds'
132         >>> containers.containers['tender_rosalind']['STATUS']
133         'Exited (137) 18 hours ago'
134     """
135     key_field = 'NAMES'
136     heading_ignore = ['CONTAINER']
137     attr_name = 'containers'
138     substitutions = [("CONTAINER ID", "CONTAINER_ID")]
139 
140     @property
141     def data(self):
142         return self.containers
143
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/insights/parsers/docker_list.py b/insights/parsers/docker_list.py
--- a/insights/parsers/docker_list.py
+++ b/insights/parsers/docker_list.py
@@ -61,6 +61,12 @@
         if not (self.key_field and self.attr_name):
             raise NotImplementedError("'key_field' or 'attr_name' is not defined")
 
+        # There is another application named docker that's a kde system tray, that
+        # will output help when the spec is run due to incorrect arguments. So check
+        # the content for any lines starting with Usage: so it can be skipped.
+        if any(l for l in content if l.startswith("Usage: ")):
+            raise SkipException('No data only help output.')
+
         self.rows = parse_fixed_table(content,
                                       heading_ignore=self.heading_ignore,
                                       header_substitute=self.substitutions)

{"golden_diff": "diff --git a/insights/parsers/docker_list.py b/insights/parsers/docker_list.py\n--- a/insights/parsers/docker_list.py\n+++ b/insights/parsers/docker_list.py\n@@ -61,6 +61,12 @@\n         if not (self.key_field and self.attr_name):\n             raise NotImplementedError(\"'key_field' or 'attr_name' is not defined\")\n \n+        # There is another application named docker that's a kde system tray, that\n+        # will output help when the spec is run due to incorrect arguments. So check\n+        # the content for any lines starting with Usage: so it can be skipped.\n+        if any(l for l in content if l.startswith(\"Usage: \")):\n+            raise SkipException('No data only help output.')\n+\n         self.rows = parse_fixed_table(content,\n                                       heading_ignore=self.heading_ignore,\n                                       header_substitute=self.substitutions)\n", "issue": "The docker_list parser is raising ValueError exceptions in production.\nThe DockerList parser is throwing a number of the exception ValueError(\"Line containing 'REPOSITORY' was not found in table\",), and ValueError(\"Line containing 'CONTAINER' was not found in table\",) in production.\n", "before_files": [{"content": "\"\"\"\nDockerList - command ``/usr/bin/docker (images|ps)``\n====================================================\n\nParse the output of command \"docker_list_images\" and \"docker_list_containers\",\nwhich have very similar formats.\n\nThe header line is parsed and used as the names for the remaining columns.\nAll fields in both header and data are assumed to be separated by at least\nthree spaces.  This allows single spaces in values and headers, so headers\nsuch as 'IMAGE ID' are captured as is.\n\nIf the header line and at least one data line are not found, no data is\nstored.\n\nEach row is stored as a dictionary, keyed on the header fields.  The data is\navailable in two formats:\n\n* The old format is a list of row dictionaries.\n* The new format stores each dictionary in a dictionary keyed on the value of\n  a given field, given by the subclass.\n\n\"\"\"\nfrom insights import CommandParser, parser\nfrom insights.parsers import SkipException, parse_fixed_table\nfrom insights.specs import Specs\n\n\nclass DockerList(CommandParser):\n    \"\"\"\n    A general class for parsing tabular docker list information.  Parsing\n    rules are:\n\n    * The first line is the header line.\n    * The other lines are data lines.\n    * All fields line up vertically.\n    * Fields are separated from each other by at least three spaces.\n    * Some fields can contain nothing, and this is shown as spaces, so we\n      need to catch that and turn it into None.\n\n    Why not just use hard-coded fields and columns?  So that we can adapt to\n    different output lists.\n\n    Raises:\n        NotImplementedError: If `key_field` or `attr_name` is not defined\n        SkipException: If no data to parse\n    \"\"\"\n    key_field = None\n    heading_ignore = []\n    attr_name = ''\n    substitutions = []\n\n    def parse_content(self, content):\n        \"\"\"\n        Parse the lines given into a list of dictionaries for each row.  This\n        is stored in the ``rows`` attribute.\n\n        If the ``key_field`` property is set, use this to key a ``data``\n        dictionary attribute.\n        \"\"\"\n        if not (self.key_field and self.attr_name):\n            raise NotImplementedError(\"'key_field' or 'attr_name' is not defined\")\n\n        self.rows = parse_fixed_table(content,\n                                      heading_ignore=self.heading_ignore,\n                                      header_substitute=self.substitutions)\n\n        if not self.rows:\n            raise SkipException('No data.')\n\n        data = {}\n        for row in self.rows:\n            k = row.get(self.key_field)\n            for sub in self.substitutions:\n                row[sub[0]] = row.pop(sub[1]) if sub[1] in row else None\n            if k is not None and k != '<none>':\n                data[k] = row\n        setattr(self, self.attr_name, data)\n\n\n@parser(Specs.docker_list_images)\nclass DockerListImages(DockerList):\n    \"\"\"\n    Handle the list of docker images using the DockerList parser class.\n\n    Sample output of command ``docker images --all --no-trunc --digests``::\n\n        REPOSITORY                           TAG                 DIGEST              IMAGE ID                                                           CREATED             VIRTUAL SIZE\n        rhel7_imagemagick                    latest              <none>              882ab98aae5394aebe91fe6d8a4297fa0387c3cfd421b2d892bddf218ac373b2   4 days ago          785.4 MB\n        rhel6_nss-softokn                    latest              <none>              dd87dad2c7841a19263ae2dc96d32c501ee84a92f56aed75bb67f57efe4e48b5   5 days ago          449.7 MB\n\n    Attributes:\n        rows (list): List of row dictionaries.\n        images (dict): Dictionary keyed on the value of the \"REPOSITORY\" fileld\n\n    Examples:\n        >>> images.rows[0]['REPOSITORY']\n        'rhel6_vsftpd'\n        >>> images.rows[1]['VIRTUAL SIZE']\n        '785.4 MB'\n        >>> images.images['rhel6_vsftpd']['CREATED']\n        '37 minutes ago'\n    \"\"\"\n    key_field = 'REPOSITORY'\n    heading_ignore = [key_field]\n    attr_name = 'images'\n    substitutions = [(\"IMAGE ID\", \"IMAGE_ID\"), (\"VIRTUAL SIZE\", \"VIRTUAL_SIZE\")]\n\n    @property\n    def data(self):\n        return self.images\n\n\n@parser(Specs.docker_list_containers)\nclass DockerListContainers(DockerList):\n    \"\"\"\n    Handle the list of docker images using the DockerList parser class.\n\n    Sample output of command ``docker ps --all --no-trunc --size``::\n\n        CONTAINER ID                                                       IMAGE                                                              COMMAND                                            CREATED             STATUS                        PORTS                  NAMES               SIZE\n        95516ea08b565e37e2a4bca3333af40a240c368131b77276da8dec629b7fe102   bd8638c869ea40a9269d87e9af6741574562af9ee013e03ac2745fb5f59e2478   \"/bin/sh -c 'yum install -y vsftpd-2.2.2-6.el6'\"   51 minutes ago      Exited (137) 50 minutes ago                          tender_rosalind     4.751 MB (virtual 200.4 MB)\n        03e2861336a76e29155836113ff6560cb70780c32f95062642993b2b3d0fc216   rhel7_httpd                                                        \"/usr/sbin/httpd -DFOREGROUND\"                     45 seconds ago      Up 37 seconds                 0.0.0.0:8080->80/tcp   angry_saha          796 B (virtual 669.2 MB)\n\n    Attributes:\n        rows (list): List of row dictionaries.\n        containers(dict): Dictionary keyed on the value of the \"NAMES\" field\n\n    Examples:\n        >>> containers.rows[0]['STATUS']\n        'Up 37 seconds'\n        >>> containers.containers['tender_rosalind']['STATUS']\n        'Exited (137) 18 hours ago'\n    \"\"\"\n    key_field = 'NAMES'\n    heading_ignore = ['CONTAINER']\n    attr_name = 'containers'\n    substitutions = [(\"CONTAINER ID\", \"CONTAINER_ID\")]\n\n    @property\n    def data(self):\n        return self.containers\n", "path": "insights/parsers/docker_list.py"}], "after_files": [{"content": "\"\"\"\nDockerList - command ``/usr/bin/docker (images|ps)``\n====================================================\n\nParse the output of command \"docker_list_images\" and \"docker_list_containers\",\nwhich have very similar formats.\n\nThe header line is parsed and used as the names for the remaining columns.\nAll fields in both header and data are assumed to be separated by at least\nthree spaces.  This allows single spaces in values and headers, so headers\nsuch as 'IMAGE ID' are captured as is.\n\nIf the header line and at least one data line are not found, no data is\nstored.\n\nEach row is stored as a dictionary, keyed on the header fields.  The data is\navailable in two formats:\n\n* The old format is a list of row dictionaries.\n* The new format stores each dictionary in a dictionary keyed on the value of\n  a given field, given by the subclass.\n\n\"\"\"\nfrom insights import CommandParser, parser\nfrom insights.parsers import SkipException, parse_fixed_table\nfrom insights.specs import Specs\n\n\nclass DockerList(CommandParser):\n    \"\"\"\n    A general class for parsing tabular docker list information.  Parsing\n    rules are:\n\n    * The first line is the header line.\n    * The other lines are data lines.\n    * All fields line up vertically.\n    * Fields are separated from each other by at least three spaces.\n    * Some fields can contain nothing, and this is shown as spaces, so we\n      need to catch that and turn it into None.\n\n    Why not just use hard-coded fields and columns?  So that we can adapt to\n    different output lists.\n\n    Raises:\n        NotImplementedError: If `key_field` or `attr_name` is not defined\n        SkipException: If no data to parse\n    \"\"\"\n    key_field = None\n    heading_ignore = []\n    attr_name = ''\n    substitutions = []\n\n    def parse_content(self, content):\n        \"\"\"\n        Parse the lines given into a list of dictionaries for each row.  This\n        is stored in the ``rows`` attribute.\n\n        If the ``key_field`` property is set, use this to key a ``data``\n        dictionary attribute.\n        \"\"\"\n        if not (self.key_field and self.attr_name):\n            raise NotImplementedError(\"'key_field' or 'attr_name' is not defined\")\n\n        # There is another application named docker that's a kde system tray, that\n        # will output help when the spec is run due to incorrect arguments. So check\n        # the content for any lines starting with Usage: so it can be skipped.\n        if any(l for l in content if l.startswith(\"Usage: \")):\n            raise SkipException('No data only help output.')\n\n        self.rows = parse_fixed_table(content,\n                                      heading_ignore=self.heading_ignore,\n                                      header_substitute=self.substitutions)\n\n        if not self.rows:\n            raise SkipException('No data.')\n\n        data = {}\n        for row in self.rows:\n            k = row.get(self.key_field)\n            for sub in self.substitutions:\n                row[sub[0]] = row.pop(sub[1]) if sub[1] in row else None\n            if k is not None and k != '<none>':\n                data[k] = row\n        setattr(self, self.attr_name, data)\n\n\n@parser(Specs.docker_list_images)\nclass DockerListImages(DockerList):\n    \"\"\"\n    Handle the list of docker images using the DockerList parser class.\n\n    Sample output of command ``docker images --all --no-trunc --digests``::\n\n        REPOSITORY                           TAG                 DIGEST              IMAGE ID                                                           CREATED             VIRTUAL SIZE\n        rhel7_imagemagick                    latest              <none>              882ab98aae5394aebe91fe6d8a4297fa0387c3cfd421b2d892bddf218ac373b2   4 days ago          785.4 MB\n        rhel6_nss-softokn                    latest              <none>              dd87dad2c7841a19263ae2dc96d32c501ee84a92f56aed75bb67f57efe4e48b5   5 days ago          449.7 MB\n\n    Attributes:\n        rows (list): List of row dictionaries.\n        images (dict): Dictionary keyed on the value of the \"REPOSITORY\" fileld\n\n    Examples:\n        >>> images.rows[0]['REPOSITORY']\n        'rhel6_vsftpd'\n        >>> images.rows[1]['VIRTUAL SIZE']\n        '785.4 MB'\n        >>> images.images['rhel6_vsftpd']['CREATED']\n        '37 minutes ago'\n    \"\"\"\n    key_field = 'REPOSITORY'\n    heading_ignore = [key_field]\n    attr_name = 'images'\n    substitutions = [(\"IMAGE ID\", \"IMAGE_ID\"), (\"VIRTUAL SIZE\", \"VIRTUAL_SIZE\")]\n\n    @property\n    def data(self):\n        return self.images\n\n\n@parser(Specs.docker_list_containers)\nclass DockerListContainers(DockerList):\n    \"\"\"\n    Handle the list of docker images using the DockerList parser class.\n\n    Sample output of command ``docker ps --all --no-trunc --size``::\n\n        CONTAINER ID                                                       IMAGE                                                              COMMAND                                            CREATED             STATUS                        PORTS                  NAMES               SIZE\n        95516ea08b565e37e2a4bca3333af40a240c368131b77276da8dec629b7fe102   bd8638c869ea40a9269d87e9af6741574562af9ee013e03ac2745fb5f59e2478   \"/bin/sh -c 'yum install -y vsftpd-2.2.2-6.el6'\"   51 minutes ago      Exited (137) 50 minutes ago                          tender_rosalind     4.751 MB (virtual 200.4 MB)\n        03e2861336a76e29155836113ff6560cb70780c32f95062642993b2b3d0fc216   rhel7_httpd                                                        \"/usr/sbin/httpd -DFOREGROUND\"                     45 seconds ago      Up 37 seconds                 0.0.0.0:8080->80/tcp   angry_saha          796 B (virtual 669.2 MB)\n\n    Attributes:\n        rows (list): List of row dictionaries.\n        containers(dict): Dictionary keyed on the value of the \"NAMES\" field\n\n    Examples:\n        >>> containers.rows[0]['STATUS']\n        'Up 37 seconds'\n        >>> containers.containers['tender_rosalind']['STATUS']\n        'Exited (137) 18 hours ago'\n    \"\"\"\n    key_field = 'NAMES'\n    heading_ignore = ['CONTAINER']\n    attr_name = 'containers'\n    substitutions = [(\"CONTAINER ID\", \"CONTAINER_ID\")]\n\n    @property\n    def data(self):\n        return self.containers\n", "path": "insights/parsers/docker_list.py"}]}