ส่วนประกอบที่ใช้คอนเทนเนอร์ให้ความยืดหยุ่นในการรวมโค้ดที่เขียนในภาษาใดๆ ลงในไปป์ไลน์ของคุณ ตราบใดที่คุณสามารถรันโค้ดนั้นในคอนเทนเนอร์ Docker ได้
หากคุณยังใหม่กับไปป์ไลน์ TFX เรียนรู้เพิ่มเติมเกี่ยวกับแนวคิดหลักของไปป์ไลน์ TFX
การสร้างส่วนประกอบตามคอนเทนเนอร์
 ส่วนประกอบแบบคอนเทนเนอร์ได้รับการสนับสนุนโดยโปรแกรมบรรทัดคำสั่งแบบคอนเทนเนอร์ หากคุณมีอิมเมจคอนเทนเนอร์อยู่แล้ว คุณสามารถใช้ TFX เพื่อสร้างส่วนประกอบจากอิมเมจคอนเทนเนอร์ได้โดยใช้ ฟังก์ชัน create_container_component เพื่อประกาศอินพุตและเอาต์พุต พารามิเตอร์ฟังก์ชัน:
- name: ชื่อของส่วนประกอบ
- อินพุต: พจนานุกรมที่จับคู่ชื่ออินพุตกับประเภท เอาท์พุต: พจนานุกรมที่จับคู่ชื่อเอาต์พุตกับประเภทพารามิเตอร์: พจนานุกรมที่จับคู่ชื่อพารามิเตอร์เป็นประเภท
- รูปภาพ: ชื่อรูปภาพคอนเทนเนอร์ และแท็กรูปภาพ (ไม่บังคับ)
-  คำสั่ง: บรรทัดคำสั่งจุดเข้าคอนเทนเนอร์ ไม่ได้ดำเนินการภายในเชลล์ บรรทัดคำสั่งสามารถใช้ออบเจ็กต์ตัวยึดตำแหน่งที่ถูกแทนที่ในเวลาคอมไพล์ด้วยอินพุต เอาท์พุต หรือพารามิเตอร์ สามารถนำเข้าวัตถุตัวยึดตำแหน่งได้จาก tfx.dsl.component.experimental.placeholdersโปรดทราบว่าไม่รองรับเทมเพลต Jinja
ค่าที่ส่งคืน: คลาส Component ที่สืบทอดมาจาก base_component.BaseComponent ซึ่งสามารถสร้างอินสแตนซ์และใช้ภายในไปป์ไลน์ได้
ตัวยึดตำแหน่ง
 สำหรับส่วนประกอบที่มีอินพุตหรือเอาต์พุต command มักจะต้องมีตัวยึดตำแหน่งที่ถูกแทนที่ด้วยข้อมูลจริงในขณะรันไทม์ ตัวยึดตำแหน่งหลายรายการมีไว้เพื่อจุดประสงค์นี้:
- InputValuePlaceholder: ตัวยึดตำแหน่งสำหรับค่าของส่วนอินพุต ณ รันไทม์ ตัวยึดนี้จะถูกแทนที่ด้วยการแสดงสตริงของค่าของส่วน
- InputUriPlaceholder: ตัวยึดสำหรับ URI ของอาร์กิวเมนต์สิ่งประดิษฐ์อินพุต ณ รันไทม์ ตัวยึดตำแหน่งนี้จะถูกแทนที่ด้วย URI ของข้อมูลของอินพุต
- OutputUriPlaceholder: ตัวยึดตำแหน่งสำหรับ URI ของอาร์กิวเมนต์ส่วนเอาต์พุต ณ รันไทม์ ตัวยึดตำแหน่งนี้จะถูกแทนที่ด้วย URI โดยที่คอมโพเนนต์ควรจัดเก็บข้อมูลของส่วนเอาต์พุต
เรียนรู้เพิ่มเติมเกี่ยวกับ ตัวยึดบรรทัดคำสั่งคอมโพเนนต์ TFX
ตัวอย่างส่วนประกอบที่ใช้คอนเทนเนอร์
ต่อไปนี้เป็นตัวอย่างขององค์ประกอบที่ไม่ใช่หลามที่ดาวน์โหลด แปลง และอัปโหลดข้อมูล:
import tfx.v1 as tfx
grep_component = tfx.dsl.components.create_container_component(
    name='FilterWithGrep',
    inputs={
        'text': tfx.standard_artifacts.ExternalArtifact,
    },
    outputs={
        'filtered_text': tfx.standard_artifacts.ExternalArtifact,
    },
    parameters={
        'pattern': str,
    },
    # The component code uses gsutil to upload the data to Google Cloud Storage, so the
    # container image needs to have gsutil installed and configured.
    image='google/cloud-sdk:278.0.0',
    command=[
        'sh', '-exc',
        '''
          pattern="$1"
          text_uri="$3"/data  # Adding suffix, because currently the URI are "directories". This will be fixed soon.
          text_path=$(mktemp)
          filtered_text_uri="$5"/data  # Adding suffix, because currently the URI are "directories". This will be fixed soon.
          filtered_text_path=$(mktemp)
          # Getting data into the container
          gsutil cp "$text_uri" "$text_path"
          # Running the main code
          grep "$pattern" "$text_path" >"$filtered_text_path"
          # Getting data out of the container
          gsutil cp "$filtered_text_path" "$filtered_text_uri"
        ''',
        '--pattern', tfx.dsl.placeholders.InputValuePlaceholder('pattern'),
        '--text', tfx.dsl.placeholders.InputUriPlaceholder('text'),
        '--filtered-text', tfx.dsl.placeholders.OutputUriPlaceholder('filtered_text'),
    ],
)