docs: def _modify_instruction_label_env(self, instruction, instr_key, instr_value):
          """
          set <INSTRUCTION> instr_key to instr_value
  
          :param instr_key: str, label key
          :param instr_value: str or None, new label/env value or None to remove
          """
          if instruction == 'LABEL':
              instructions = self.labels
          elif instruction == 'ENV':
              instructions = self.envs
          else:
              raise ValueError("Unknown instruction '%s'" % instruction)
  
          if instr_key not in instructions:
              raise KeyError('%s not in %ss' % (instr_key, instruction))
  
          # extract target instructions from the final stage only
          candidates = []
          for insn in self.structure:
              if insn['instruction'] == 'FROM':
                  candidates = []
              if insn['instruction'] == instruction:
                  candidates.append(insn)
  
          # Find where in the file to put the changes
          content = startline = endline = None
          for candidate in candidates:
              words = list(WordSplitter(candidate['value']).split(dequote=False))
  
              # LABEL/ENV syntax is one of two types:
              if '=' not in words[0]:  # LABEL/ENV name value
                  # Remove quotes from key name and see if it's the one
                  # we're looking for.
                  if WordSplitter(words[0]).dequote() == instr_key:
                      if instr_value is None:
                          # Delete this line altogether
                          content = None
                      else:
                          # Adjust label/env value
                          words[1:] = [quote(instr_value)]
  
                          # Now reconstruct the line
                          content = " ".join([instruction] + words) + '\n'
  
                      startline = candidate['startline']
                      endline = candidate['endline']
                      break
              else:  # LABEL/ENV "name"="value"
                  for index, token in enumerate(words):
                      key, _ = token.split("=", 1)
                      if WordSplitter(key).dequote() == instr_key:
                          if instr_value is None:
                              # Delete this label
                              del words[index]
                          else:
                              # Adjust label/env value
                              words[index] = "{0}={1}".format(key,
                                                              quote(instr_value))
  
                          if len(words) == 0:
                              # We removed the last label/env, delete the whole line
                              content = None
                          else:
                              # Now reconstruct the line
                              content = " ".join([instruction] + words) + '\n'
  
                          startline = candidate['startline']
                          endline = candidate['endline']
                          break
  
          # We know the label/env we're looking for is there
          assert startline and endline
  
          # Re-write the Dockerfile
          lines = self.lines
          del lines[startline:endline + 1]
          if content:
              lines.insert(startline, content)
          self.lines = lines