การสร้างอิมเมจ NodeJSDocker แบบกำหนดเองบน rhel7

ฉันกำลังสร้างอิมเมจ Docker พื้นฐานสำหรับองค์กรของฉันเพื่อให้ทีมแอปพลิเคชันใช้เมื่อพวกเขาปรับใช้แอปพลิเคชันใน OpenShift หนึ่งในรูปภาพที่ฉันต้องทำคือรูปภาพ NodeJS (เราต้องการให้รูปภาพของเราเป็นแบบภายในแทนที่จะมาจาก DockerHub) ฉันกำลังสร้างจากอิมเมจฐานสากล RHEL7 (ubi) ของ RedHat อย่างไรก็ตาม ฉันประสบปัญหาในการกำหนดค่า NodeJS ให้ทำงานในคอนเทนเนอร์ นี่คือ Dockerfile ของฉัน:

FROM myimage_rhel7_base:1.0

USER root

RUN INSTALL_PKGS="rh-nodejs10 rh-nodejs10-npm rh-nodejs10-nodejs-nodemon nss_wrapper" && \
    yum install -y --setopt=tsflags=nodocs $INSTALL_PKGS && \
    rpm -V $INSTALL_PKGS && \
    yum clean all

USER myuser

อย่างไรก็ตาม เมื่อฉันเรียกใช้อิมเมจ ไม่มีคำสั่ง node หรือ npm เว้นแต่ฉันจะเรียกใช้ scl enable rh-nodejs10 bash สิ่งนี้ใช้ไม่ได้กับ Dockerfile เนื่องจากจะสร้างเชลล์ย่อยที่ผู้ใช้ที่เข้าถึงคอนเทนเนอร์จะไม่สามารถใช้งานได้

ฉันได้ลองติดตั้งจากแหล่งที่มาแล้ว แต่ฉันพบปัญหาอื่นที่จำเป็นต้องอัปเกรดเวอร์ชัน gcc/g++ แม้ว่าเวอร์ชันเหล่านั้นจะไม่พร้อมใช้งานใน repos ที่กำหนดค่าไว้จากองค์กรของฉันก็ตาม ฉันยังคิดว่าหากฉันสามารถให้ NodeJS ทำงานจากตัวจัดการแพ็คเกจได้ มันจะช่วยให้ได้รับแพตช์ด้านความปลอดภัย และควรอัปเดตแพ็คเกจด้วย

คำถามของฉันคือ ขั้นตอนที่แนะนำในการสร้างอิมเมจที่สามารถใช้สร้างแอปพลิเคชันที่ทำงานบน NodeJS คืออะไร


person willh99    schedule 06.08.2019    source แหล่งที่มา


คำตอบ (2)


อาจเป็นกรณีที่โค้ดที่ดีที่สุดคือโค้ดที่คุณไม่ได้เขียนเลย ดูที่ https://github.com/sclorg/s2i-nodejs-container

เป็นโปรเจ็กต์ที่สร้างอิมเมจที่ติดตั้ง nodejs นี่อาจเป็นโซลูชันที่สมบูรณ์แบบตั้งแต่เริ่มใช้ หรืออาจเป็นตัวอย่างที่ดีของสิ่งที่คุณพยายามสร้าง

นอกจากนี้ readme ของพวกเขายังพยายามอธิบายว่าพวกเขาหลีกเลี่ยงคำสั่ง scl Enable ได้อย่างไร

โดยปกติ SCL จำเป็นต้องมีการดำเนินการด้วยตนเองเพื่อเปิดใช้งานคอลเลกชันที่คุณต้องการใช้ นี่เป็นภาระและอาจเกิดข้อผิดพลาดได้ วิธี OpenShift S2I คือการตั้งค่าตัวแปรสภาพแวดล้อม Bash ที่ทำหน้าที่เปิดใช้งานคอลเลกชันที่ต้องการโดยอัตโนมัติ:

  • BASH_ENV: เปิดใช้งานการรวบรวมสำหรับเซสชัน Bash ที่ไม่โต้ตอบทั้งหมด
  • ENV: เปิดใช้งานการรวบรวมสำหรับการร้องขอทั้งหมดของ /bin/sh
  • PROMPT_COMMAND: เปิดใช้งานคอลเลกชันในเชลล์แบบโต้ตอบ

สองตัวอย่าง: * หากคุณระบุ BASH_ENV สคริปต์ #!/bin/bash ทั้งหมดของคุณไม่จำเป็นต้องเรียก scl enable * หากคุณระบุ PROMPT_COMMAND เมื่อดำเนินการคำสั่ง podman exec ... /bin/bash คอลเลกชันจะถูกเปิดใช้งานโดยอัตโนมัติ

person Adam Wise    schedule 08.08.2019

ในที่สุดฉันก็ตัดสินใจติดตั้งโหนดโดยใช้ไบนารีแทนเซิร์ฟเวอร์ rpm ของเรา นี่คือการดำเนินการ

FROM myimage_rhel7_base:1.0

USER root

# Get node distribution from nexus and install it
RUN   wget -P /tmp http://myrepo.example.com/repository/node/node-v10.16.3-linux-x64.tar.xz && \
      tar -C /usr/local --strip-components 1 -xf /tmp/node-v10.16.3-linux-x64.tar.xz && \
      rm /tmp/node-v10.16.3-linux-x64.tar.xz


person willh99    schedule 18.09.2019