Score:3

การโอนย้ายเนื้อหาจากสภาพแวดล้อมที่ใช้งานจริงไปยังสภาพแวดล้อมการพัฒนาด้วย Docker

ธง id

ฉันกำลังพยายามสร้างเซิร์ฟเวอร์การพัฒนา localhost ด้วยสภาพแวดล้อม dockerized drupal 8 และจำเป็นต้องถ่ายโอนเนื้อหาจากไซต์สดไปยัง localhost

ฉันได้ทำตามคำแนะนำสำหรับการเทียบท่าที่นี่: https://www.drupal.org/docs/develop/local-server-setup/docker-with-solr-integration/docker-configuration

และตอนนี้ฉันต้องย้ายเนื้อหาจากไซต์ที่ใช้งานจริงไปยังเซิร์ฟเวอร์สำหรับนักพัฒนา และฉันก็สับสนเกี่ยวกับกระบวนการนี้

ข้อมูลใด ๆ ที่จะได้รับการชื่นชมอย่างสูง!

แก้ไข:

วิธีหนึ่งในการนำเข้าสู่สภาพแวดล้อมท้องถิ่นของฉันคือการสร้างไฟล์ การถ่ายโอนข้อมูล SQL จากฐานข้อมูลสดแล้วอัปโหลดไปยังไฟล์ docker-compose ของฉัน

รุ่น: '3'
บริการ:
  ฐานข้อมูล:
    ภาพ: mariadb:10.3
    สิ่งแวดล้อม:
      MYSQL_DATABASE: drupal
      MYSQL_ROOT_PASSWORD: MyGreatPassword
    ปริมาณ:
      - db_data:/var/lib/mysql
    รีสตาร์ท: เสมอ

  phpmyadmin:
    ขึ้นอยู่กับ:
      - ฐานข้อมูล
    ภาพ: phpmyadmin/phpmyadmin
    รีสตาร์ท: เสมอ
    พอร์ต:
      - "8080:80"
    สิ่งแวดล้อม:
      PMA_HOST: ฐานข้อมูล
      MYSQL_ROOT_PASSWORD: MyGreatPassword
      UPLOAD_LIMIT: '500M'

  ดรูปาล:
    ขึ้นอยู่กับ:
      - ฐานข้อมูล
    สร้าง: .
    พอร์ต:
      - "2345:80"
      - "2443:443"
    ปริมาณ:
      - ./:/var/www/html
    รีสตาร์ท: เสมอ

  โซล:
    ภาพ: solr:8
    พอร์ต:
      - "8983:8983"
    ปริมาณ:
      - ./mycores/collection1:/mycores/collection1
    จุดเริ่มต้น:
      - docker-entrypoint.sh
      - โซล-พรีครีเอท
      - คอลเลคชั่น1
      - /mycores/collection1
ปริมาณ:
  db_data:

ตอนนี้ฉันมีข้อผิดพลาดนี้

ใน Statement.php บรรทัดที่ 59                                                                              
  SQLSTATE[42S22]: ไม่พบคอลัมน์: 1054 คอลัมน์ที่ไม่รู้จัก 'แท็ก' ใน 'รายการฟิลด์'

ใน Connection.php บรรทัด 701:
                                                                                                                                             
  SQLSTATE[42S22]: ไม่พบคอลัมน์: 1054 คอลัมน์ที่ไม่รู้จัก 'แท็ก' ใน 'รายการฟิลด์': INSERT INTO {cache_bootstrap} (cid, หมดอายุ, สร้าง, แท็ก,  
   การตรวจสอบ, ข้อมูล, อนุกรม) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder  
  _3, :db_insert_placeholder_4, :db_insert_placeholder_5, :db_insert_placeholder_6) ในการอัปเดตคีย์ซ้ำ cid = VALUES(cid) หมดอายุ = VAL  
  UES(หมดอายุ) สร้างแล้ว = VALUES(สร้างแล้ว) แท็ก = VALUES(แท็ก) เช็คซัม = VALUES(เช็คซัม) ข้อมูล = VALUES(ข้อมูล) ซีเรียลไลซ์ = VALUES(ซีเรียล  
  ขนาด); อาร์เรย์                                                                                                                               
  (                                                                                                                                          
      [:db_insert_placeholder_0] => hook_info                                                                                                
      [:db_insert_placeholder_1] => -1                                                                                                       
      [:db_insert_placeholder_2] => 1626559961.843                                                                                           
      [:db_insert_placeholder_3] =>                                                                                                          
      [:db_insert_placeholder_4] => 0                                                                                                        
      [:db_insert_placeholder_5] => a:39:{s:10:"token_info";a:1:{s:5:"group";s:6:"tokens";}s:16:"token_info_alter";a :1:{s:5:"กลุ่ม";s:6:"ถึง  
  kens";}s:6:"tokens";a:1:{s:5:"group";s:6:"tokens";}s:12:"tokens_alter";a:1:{s:5 :"group";s:6:"tokens";}s:10:"views_data";a:1:{s:5:"group";  
  s:5:"views";}s:16:"views_data_alter";a:1:{s:5:"group";s:5:"views";}s:13:"views_analyze";a:1 :{s:5:"group";s:5:"views";}s:22:"views_invalid  
  ate_cache";a:1:{s:5:"group";s:5:"views";}s:26:"views_plugins_access_alter";a:1:{s:5:"group";s:5: "มุมมอง";}s:24:"views_plugins_area_alter";  
  a:1:{s:5:"group";s:5:"views";}s:28:"views_plugins_argument_alter";a:1:{s:5:"group";s:5:"views" ;}s:36:"views_plugins_argument_default_alte  
  r";a:1:{s:5:"group";s:5:"views";}s:38:"views_plugins_argument_validator_alter";a:1:{s:5:"group";s:5: "มุมมอง";}s:25:"views_plugins_cache_al  
  ter";a:1:{s:5:"group";s:5:"views";}s:36:"views_plugins_display_extender_alter";a:1:{s:5:"group";s:5: "มุมมอง";}s:27:"views_plugins_display_  
  แก้ไข";a:1:{s:5:"group";s:5:"views";}s:32:"views_plugins_exposed_form_alter";a:1:{s:5:"group";s:5: "มุมมอง";}s:25:"views_plugins_field_alte  
  r";a:1:{s:5:"group";s:5:"views";}s:26:"views_plugins_filter_alter";a:1:{s:5:"group";s:5: "มุมมอง";}s:24:"views_plugins_join_alter";a:1:{s:5  
  :"group";s:5:"views";}s:25:"views_plugins_pager_alter";a:1:{s:5:"group";s:5:"views";}s:25:"views_plugins_query_alter ";a:1:{s:5:"กลุ่ม";s:  
  5:"views";}s:32:"views_plugins_relationship_alter";a:1:{s:5:"group";s:5:"views";}s:23:"views_plugins_row_alter";a:1:{ s:5:"group";s:5:"vie  
  ws";}s:24:"views_plugins_sort_alter";a:1:{s:5:"group";s:5:"views";}s:25:"views_plugins_style_alter";a:1:{s:5 :"group";s:5:"views";}s:26:"v  
  iews_plugins_wizard_alter";a:1:{s:5:"group";s:5:"views";}s:25:"views_query_substitutions";a:1:{s:5:"group";s:15: "views_execution";}s:24:"  
  views_form_substitutions";a:1:{s:5:"group";s:15:"views_execution";}s:14:"views_pre_view";a:1:{s:5:"group";s:15: "views_execution";}s:15:"v  
  iews_pre_build";a:1:{s:5:"group";s:15:"views_execution";}s:16:"views_post_build";a:1:{s:5:"group";s:15: "views_execution";}s:17:"views_pre  
  _execute";a:1:{s:5:"group";s:15:"views_execution";}s:18:"views_post_execute";a:1:{s:5:"group";s:15: "views_execution";}s:16:"views_pre_ren  
  der";a:1:{s:5:"group";s:15:"views_execution";}s:17:"views_post_render";a:1:{s:5:"group";s:15: "views_execution";}s:17:"views_query_alter";  
  a:1:{s:5:"group";s:15:"views_execution";}s:16:"field_views_data";a:1:{s:5:"group";s:5:"views" ;}s:22:"field_views_data_alter";a:1:{s:5:"gr  
  อัพ";s:5:"มุมมอง";}}                                                                                                                        
      [:db_insert_placeholder_6] => 1                                                                                                        
  ) 

ฉันได้อ่านวิธีแก้ปัญหาบางอย่างแล้ว อัปเดตเอนทิตีแต่คำสั่ง drush ไม่ได้รับการดูแลอีกต่อไป

เรียกใช้ drush updb

เรียกใช้ drush entup
Score:3
ธง nr

การโยกย้ายมีสองส่วน: ฐานข้อมูลและไฟล์สแตติก

ส่วนที่สำคัญที่สุดคือฐานข้อมูล คุณจะต้องสำรองฐานข้อมูล (aka ตร.ว) ของฐานข้อมูลการผลิต และคุณจะต้องนำเข้าข้อมูลนั้นไปยังฐานข้อมูลในเครื่องของคุณมีหลายวิธีในการดำเนินการนี้ ขึ้นอยู่กับการโฮสต์เว็บไซต์ของคุณและคุณสามารถใช้งานได้หรือไม่ หยด.

ไซต์ในเครื่องควรใช้งานได้บ้างหลังจากนำเข้าฐานข้อมูล แต่อาจดูแปลกหากไม่มีเนื้อหาคงที่ เช่น ไฟล์รูปภาพ ขึ้นอยู่กับวิธีการกำหนดค่าไซต์ที่ใช้งานจริง คุณอาจพบสิ่งเหล่านี้ส่วนใหญ่ในไดเร็กทอรีไฟล์สาธารณะ ตำแหน่งที่พบมากที่สุดสำหรับไฟล์เหล่านี้คือ ./web/sites/default/files แต่เส้นทางอาจแตกต่างกัน คุณจะต้องคัดลอกไฟล์เหล่านี้จากโฮสต์เว็บที่ใช้งานจริงไปยังสภาพแวดล้อมภายในเครื่องของคุณโดยใช้เครื่องมือเช่น รีซิงค์, scp, หรือ SFTP.

หากคุณได้ติดตั้ง Drush (ผ่าน นักแต่งเพลงต้องการดรัช/ดรัช) จึงจะสามารถใช้งานได้ drush sql:ซิงค์ เพื่อซิงโครไนซ์ฐานข้อมูล

ก่อนที่คุณจะทำเช่นนั้น คุณอาจต้องการตั้งค่า นามแฝง Drush สำหรับสภาพแวดล้อมในพื้นที่และระยะไกล

โปรดทราบด้วยว่า โยกย้าย Drush ใช้เพื่อวัตถุประสงค์อื่น นั่นคือการโยกย้ายเนื้อหาของไซต์จากแพลตฟอร์มอื่นที่ไม่ใช่ Drupal ไปยังไซต์ Drupal ของคุณ

ในการทดลองทางความคิด สมมติว่าคุณมีไซต์ Drupal สามชุด ได้แก่ Dev, Stage และ Prod บนเซิร์ฟเวอร์เดียว (โดยใช้ Apache2 สามชุดที่แตกต่างกัน โฮสต์เสมือน กับ DocumentRoot ตั้งค่าให้ /var/www/dev, /var/www/stg, และ /var/www/prd).

ในกรณีนั้น คุณสามารถใช้ local_sync ฟังก์ชันที่กำหนดไว้ด้านล่างเพื่อซิงค์ฐานข้อมูลและไฟล์จากสภาพแวดล้อมที่สูงกว่าไปยังสภาพแวดล้อมที่ต่ำกว่า:

#!/bin/bash
â
ฟังก์ชัน local_drush () {
  ถ้า [[ $# -eq 0 ]]; แล้ว
    echo "local_drush (ตั้งค่าสภาพแวดล้อมและเรียกใช้โปรเจ็กต์-local drush)"
    echo "การใช้งาน: local_drush [dev stg prd] [drush-args]"
    echo "ตั้งค่าสภาพแวดล้อมเป็น dev stg หรือ prod จากนั้นส่ง argv ไปยัง local drush"
  ไฟ
  ถ้า [[ $1 == 'dev' ]] || [[ $1 == 'stg' ]] || [[ $1 == 'prd' ]]; แล้ว
    RETURN_DIR=${PWD}
    ซีดี /var/www/$1
    ./vendor/bin/drush ${@:2}
    ซีดี ${RETURN_DIR}
  อื่น
    echo "การใช้งานไม่ถูกต้อง: arg แรกต้องเป็น dev, stg หรือ prd"
  ไฟ
}
â
ฟังก์ชัน local_sync () {
    ถ้า [[ $# -lt 1 ]] || [[ $# -gt 2 ]]; แล้ว
    echo "local_sync (ย้ายฐานข้อมูลและไฟล์ไปยังสภาพแวดล้อมที่ต่ำกว่า)"
    echo "การใช้งาน: local_sync <SOURCE> <TARGET>"
    echo "ตั้งค่าสภาพแวดล้อมต้นทางและเป้าหมาย จากนั้นซิงค์ฐานข้อมูลและไฟล์"
  ไฟ
  ถ้า [[ $1 == 'prd' ]] || [[ $1 == 'stg' ]]; แล้ว
    แหล่งที่มา=$1
    ถ้า [[ $2 == 'stg' ]] || [[ $2 == 'พัฒนา' ]]; แล้ว
      เป้าหมาย=$2
      ถ้า [[ ( $1 = 'prd' && $2 == 'stg' ) || ( $1 = 'prd' && $2 == 'dev' ) || ( $1 = 'stg' && $2 == 'dev' ) ]]; แล้ว
        RETURN_DIR=${PWD}
        BACKUP_DIR=$HOME/sqldumps/${SOURCE}
        BACKUP_FILE=${BACKUP_DIR}/${SOURCE}_$(วันที่ -I).sql
        mkdir -p ${BACKUP_DIR}
        SOURCE_FILES=/var/www/${SOURCE}/web/sites/default/files/
        TARGET_FILES=/var/www/${TARGET}/web/sites/default/files/
        EXCLUDE_CSS=${SOURCE_FILES}css/
        EXCLUDE_JS=${SOURCE_FILES}js/
        EXCLUDE_PHP=${SOURCE_FILES}php/
â
        echo "กำลังสร้างการสำรองฐานข้อมูลชั่วคราวของสภาพแวดล้อม ${SOURCE} ..."
        local_drush ${SOURCE} sql:dump > ${BACKUP_FILE}
â
        ถ้า [[ -s "${BACKUP_FILE}" ]]; แล้ว
          echo "กำลังนำเข้าฐานข้อมูลสำรองไปยังสภาพแวดล้อม ${TARGET} ..."
          local_drush ${TARGET} sqlc < ${BACKUP_FILE}
          echo "กำลังปรับใช้การกำหนดค่าแบบสเตจสำหรับ ${TARGET} สภาพแวดล้อม ..."
          local_drush ${TARGET} ทำให้ใช้งานได้
          echo "กำลังคัดลอกไฟล์สาธารณะจาก ${SOURCE} ไปยัง ${TARGET} ..."
          rsync --ไม่รวม ${EXCLUDE_CSS} \
          --ไม่รวม ${EXCLUDE_JS} \
          --ไม่รวม ${EXCLUDE_PHP} \
          --delete --progress -av ${SOURCE_FILES} ${TARGET_FILES}
          echo "สร้างแคช Drupal ใหม่สำหรับสภาพแวดล้อม ${TARGET} ..."
          local_drush แคช ${TARGET}:สร้างใหม่
          echo "นำเข้าจาก ${SOURCE} ไปยัง ${TARGET} เรียบร้อยแล้ว"
          echo "กำลังลบการสำรองฐานข้อมูลของสภาพแวดล้อม ${SOURCE} ..."
          rm ${BACKUP_FILE}
          ซีดี ${RETURN_DIR}
        อื่น
          echo "ข้อผิดพลาด: ไม่พบ ${BACKUP_FILE} ไม่สามารถดำเนินการต่อได้"
        ไฟ
      อื่น
        echo "การใช้งานไม่ถูกต้อง: ไม่สามารถคัดลอกจาก ${SOURCE} ไปยัง ${TARGET}"
      ไฟ
    อื่น
      echo "การใช้งานไม่ถูกต้อง: arg ที่สองต้องเป็น stg หรือ dev"
    ไฟ
  อื่น
    ถ้า [[ $1 == 'dev' ]]; แล้ว
      echo "การใช้งานไม่ถูกต้อง: ไม่สามารถย้ายจาก dev ไปยังสภาพแวดล้อมที่สูงกว่า"
    อื่น
      echo "การใช้งานไม่ถูกต้อง: arg แรกต้องเป็น prd หรือ stg"
    ไฟ
  ไฟ
}

โปรดทราบว่า local_sync คำสั่งขึ้นอยู่กับ local_drush คำสั่ง ซึ่งจะขึ้นอยู่กับโปรเจ็กต์โลคัลและรีโมตที่มี Drush in แบบไซต์-โลคัล ./vendor/bin/drush, ซึ่งเป็น วิธีการที่แนะนำ ของการติดตั้ง Drush เชลล์สคริปต์ไม่ได้มาตรฐาน แต่มีข้อได้เปรียบในการทำงาน ไม่ว่าคุณจะกำหนดค่านามแฝงของ Drush อย่างถูกต้องหรือไม่ก็ตาม

ฉันจะปล่อยให้คุณเป็นแบบฝึกหัดเพื่อค้นหาวิธีรับไฟล์จากเซิร์ฟเวอร์ระยะไกลของคุณเข้าสู่สภาพแวดล้อมภายในเครื่องของคุณ ไม่มีอะไรผิดปกติในการทำตามขั้นตอนเหล่านี้ด้วยตนเองหรือใช้ Filezilla เพื่อถ่ายโอนไฟล์ผ่าน SFTP ผ่าน SSH แต่ให้พิจารณาว่า รีซิงค์ คำสั่ง (ในบรรทัดที่ 49-52) สามารถใช้กับตัวอื่นได้ ${แหล่งที่มา} ซึ่งสามารถอยู่บนเซิร์ฟเวอร์ระยะไกลได้ การเปลี่ยนแปลงอื่น ๆ เพียงอย่างเดียวที่คุณต้องทำก็คือการเปลี่ยนแปลงเช่นกัน รีซิงค์ เดอะ ${BACKUP_FILE} ไปยังท้องถิ่นของคุณ (ประมาณสาย 42)

ฮา! ฉันเห็นว่าคุณแก้ไขคำถามของคุณขณะที่ฉันเขียนคำตอบ

คำถามใหม่ของคุณซ้ำกัน ตอบแล้ว ที่นี่ โดย ไคลฟ์.

จากความคิดเห็นในคำตอบนั้น:

วิธีอย่างเป็นทางการคือสำหรับโมดูลที่ใช้วิธีเก่าในการเขียนโค้ดอย่างชัดเจนเพื่อให้การอัปเดตเกิดขึ้น hook_update_N. รายละเอียดทั้งหมดอยู่ที่นี่: https://drupal.org/node/3034742

วิธีแก้ปัญหาคือการติดตั้ง การอัปเดตเอนทิตีของ Devel โมดูลซึ่งทำให้เก่า เอนอัพ drush คำสั่งใช้ได้

คุณไม่ควรใช้สิ่งนี้ในการผลิต แต่คุณสามารถใช้ในสภาพแวดล้อมการพัฒนาในพื้นที่ของคุณ ตราบใดที่คุณไม่ส่งเสริมฐานข้อมูลในเครื่องของคุณไปยังสภาพแวดล้อมการผลิต

ดูเหมือนว่าคุณประสบปัญหานี้เฉพาะในเครื่องของคุณ ไม่ใช่ในเวอร์ชันที่ใช้งานจริง ดังนั้นตัวเลือกนี้อาจเหมาะกับคุณ

ขอให้โชคดี!

Renato Francia avatar
id flag
ขอขอบคุณ! ขอขอบคุณข้อเสนอแนะนี้
hotwebmatter avatar
nr flag
ยินดีที่จะช่วย! หากคำตอบของฉันแก้ปัญหาของคุณได้ โปรดยอมรับโดยคลิกที่เครื่องหมายถูกสีเขียว
Score:2
ธง id

โอเค ฉันทำได้ค่อนข้างง่ายด้วยดรัชดัมพ์

อันดับแรก ฉันได้ดัมพ์บนเซิร์ฟเวอร์จริงด้วย:

drush sql:dump > db.sql

จากนั้นในสภาพแวดล้อมนักเทียบท่าของฉัน

ก่อนอื่นฉันแน่ใจว่าฉันวางตารางจากฐานข้อมูลจาก Phpmyadmin

จากนั้นฉันก็เข้าสู่อิมเมจนักเทียบท่า

นักเทียบท่าคอนเทนเนอร์ exec -it <docker-container-id> ทุบตี

จากนั้นเรียกใช้ drush ด้วยชื่อฐานข้อมูลที่ฉันทิ้งจาก live (ฉันใช้ filezilla เพื่อถ่ายโอนไปยัง dev ในเครื่องของฉัน)

drush sql:cli < db.sql

ตรวจสอบให้แน่ใจว่าคุณดาวน์โหลดไฟล์สาธารณะพร้อมรูปภาพและเพิ่มลงในโฟลเดอร์ไฟล์ในเครื่อง

ก่อนอื่นฉันสร้างไซต์และการตั้งค่าด้วยไซต์ว่าง จากนั้นเพิ่มเฉพาะรูปภาพเนื่องจากแทนที่ css, js และ php ที่สร้างขึ้นในไฟล์ที่สร้างปัญหา

หวังว่านี่จะช่วยได้

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา