JavaRush /جاوا بلاگ /Random-SD /اسان ڊيٽابيس سان لاڳاپيل هر شيء شامل ڪندا آهيون. (حصو 1) ...

اسان ڊيٽابيس سان لاڳاپيل هر شيء شامل ڪندا آهيون. (حصو 1) - "جاوا پروجيڪٽ A کان Z تائين"

گروپ ۾ شايع ٿيل
اسان قدم قدم تي پنهنجي منزل طرف وڌي رهيا آهيون. "جاوا پروجيڪٽ A کان Z تائين": ڊيٽابيس سان لاڳاپيل سڀ ڪجهه شامل ڪرڻ.  حصو 1 - 1اڄ اسان کي ڪيترن ئي ڪمن کي حل ڪرڻ جي ضرورت آهي:
  1. Flyway شامل ڪريو. هتي اسان پروجيڪٽ لاءِ ڊيٽابيس جي ترتيب کي ترتيب ڏينداسين.
  2. ڊيٽابيس اسڪيما شامل ڪريو.
  3. مخزن جي پرت شامل ڪريو.
  4. بوٽن جي انگن اکرن لاءِ حڪم شامل ڪريو.
  5. ٽيسٽ لکو، سڀ کان پوء.
پوءِ ويھي ويھ، پوئتي ويھ، اتي ھڪڙو ڊگهو پڙھيو ويندو. اسان اڳ ۾ ئي سکيو آهي ته اسان جي ايپليڪيشن کي ڊاکر ۽ ڊڪر-ڪپوز استعمال ڪندي ڪيئن ترتيب ڏيو . اهو آسان نه هو، ۽ انهن کي مبارڪون جن ان کي منظم ڪيو. جيڪڏهن توهان وٽ عمل درآمد بابت ڪي سوال آهن، ته توهان هن پل جي درخواست ۾ ڪوڊ ڏسي سگهو ٿا .

Flyway شامل ڪرڻ

Flyway شامل ڪرڻ لاءِ، توھان وٽ ھڪڙو ڊيٽابيس ھئڻ گھرجي، جنھن کي اسين ڊاڪر-compose ۾ ٻي خدمت طور شامل ڪنداسين. آخري دفعو مون چيو هو ته ڊاڪر-ڪمپوز وٽ هڪ سروسز سيڪشن آهي، جيڪو خاص طور تي هڪ خاص انفراسٽرڪچر کي شامل ڪرڻ ۽ ان کي منظم ڪرڻ جو ذميوار آهي - اهو آهي، ايپليڪيشنن جو هڪ سيٽ / ڊيٽابيس / ميسينجر وغيره.
مون اڳ ۾ ئي ڳالهايو آهي ته فلائي وي ڇا آهي ۽ ان کي اسپرنگ بوٽ ايپليڪيشن ۾ ڪيئن شامل ڪجي . مان توهان کي صلاح ڏيان ٿو ته هن آرٽيڪل پڙهڻ کان پهريان توهان جي يادگيري کي تازو ڪريو. توهان پڻ پڙهي سگهو ٿا README.md پروجيڪٽ جي فائل هڪ مظاهري سان گڏ مضمون جي Flyway + SpringBoot بابت.
پهرين شيء جيڪا اسان ڪندا آهيون اها آهي پروجيڪٽ ۾ اسان جي مکيه برانچ کي اپڊيٽ ڪيو (گٽ پل) ۽ اسان جي ڪم جي نالي سان هڪ نئون ٺاهيو - STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1). مون کي توهان کي ياد ڏيارڻ ڏيو: اسان شاخن جو نالو تبديل ڪيو آهي ته جيئن منصوبي ۾ ڪمن جي ترتيب کي صرف نالي سان ترتيب ڏيڻ ممڪن هو. اهو توهان کي جلدي هڪ قدم کان ٻئي ڏانهن منتقل ڪرڻ جي اجازت ڏيندو. هاڻي توهان آرام سان ڪم ڪري سگهو ٿا. اسان کي ٽي انحصار شامل ڪرڻ جي ضرورت آهي:
<dependency>
  <groupId>org.flywaydb</groupId>
  <artifactId>flyway-core</artifactId>
</dependency>

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <scope>runtime</scope>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
پهريون انحصار FlyWay کي منصوبي ۾ شامل ڪرڻ جو ذميوار آهي، ٻيو MySQL ڊيٽابيس سان ڳنڍڻ جي صلاحيت شامل ڪري ٿو. ٽيون اسپرنگ بوٽ اسٽارٽر آهي، جيڪو بهار ۾ ڊيٽابيس استعمال ڪرڻ جو سڀ جادو شروع ڪري ٿو. ۽ اچو ته هڪ لومبوڪ پڻ شامل ڪريون ته جيئن حاصل ڪندڙ ۽ سيٽر نه لکجن:
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
هاڻي اسان کي ترقي لاء ڊيٽابيس جي ضرورت آهي. اسان ان کي ھاڻي ٺاھينداسين ( جيستائين مون کي ڪو بھتر خيال نه اچي ) ھڪ الڳ ڊاڪر-compose فائل ۽ application.properties لاءِ الڳ فائل. ترقي ۾ اهڙي شيء آهي (۽ خاص طور تي بهار جي ماحولياتي نظام ۾) پروفائلز وانگر. پروفائل تي منحصر ڪري، آپريشن لاء مختلف سيٽنگون شروع ڪيون ويون آھن. مان سمجهان ٿو ته مستقبل ۾ اسان ڊاکر-ڪپوز کي هڪ فائل ۾ گڏ ڪنداسين ۽ پڪ ڪنداسين ته صرف هڪ ڊيٽابيس شروع ڪيو ويو آهي ترقي لاءِ سيٽنگون جنهن جي اسان کي ضرورت آهي. هن وقت اسان اهو ڪنداسين:
  1. اچو ته پروجيڪٽ جي روٽ ۾ هڪ فائل ٺاهيو docker-compose-test.yml، جنهن ۾ صرف ڊيٽابيس کي پنهنجي سيٽنگن سان لانچ ڪيو ويندو.
  2. اچو ته سيٽنگن سان هڪ application-test.properties فائل ٺاهيون جيڪي docker-compose-test.yml فائل ۾ سيٽنگن سان ملن.
MySQL سان ڪم ڪرڻ لاءِ، مون DockerHub کان سرڪاري تصوير ورتي : "جاوا پروجيڪٽ A کان Z تائين": ڊيٽابيس سان لاڳاپيل سڀ ڪجهه شامل ڪرڻ.  حصو 1 - 2جلدي اسڪرول ڪرڻ کان پوءِ، مون کي ضروري متغير مليا: MYSQL_DATABASE - ڊيٽابيس جو نالو MYSQL_USER - ڊيٽابيس يوزر جو نالو MYSQL_PASSWORD - ڊيٽابيس يوزر پاسورڊ ۽ انهن کي ڪيئن لکڻو پوندو صحيح:
jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_USER: root
     MYSQL_PASSWORD: root
ان کان پوء، مان پروجيڪٽ جي روٽ ۾ docker-compose-test.yml ٺاهي ٿو:
version: '3.1'

services:
 jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_USER: root
     MYSQL_PASSWORD: root
docker-compose سان ڪم ڪرڻ لاءِ هن خاص فائل کي هلائڻ لاءِ، توهان کي درخواست ۾ -f پرچم استعمال ڪرڻ جي ضرورت آهي . ان جو مطلب اهو آهي ته فائل جو نالو جيڪو شروع ڪيو ويندو مهيا ڪيو ويندو، بلڪه معياري docker-compose.yml ورتو وڃي. تنهن ڪري، درخواست هن طرح نظر ايندي: docker-compose -f docker-compose-test.yml up -d اهو ظاهر ٿئي ٿو ته پهرين اسان چئون ٿا ته ڪهڙي فائل وٺڻ گهرجي ( -f docker-compose-test.yml )، ۽ پوء اسين چون ٿا ته اسان کي خدمتن کي وڌائڻ جي ضرورت آهي ۽ اهو ڊيمون موڊ ( up -d ) ۾ ڪرڻ جي ضرورت آهي - اهو آهي، اهو عمل ٽرمينل سيشن کان ٻاهر هلندو آهي جنهن ۾ هي حڪم شروع ڪيو ويو آهي. اسان لانچ ڪريون ٿا ۽ ڊيٽابيس سان ڳنڍڻ جي ڪوشش ڪريون ٿا پڪ ڪرڻ لاءِ ته اهو مٿي آهي ۽ استعمال ڪري سگهجي ٿو. هن کي ڪرڻ لاء، واقف MySQL Workbench کوليو ( هتي اسان ان بابت ڳالهايو آهي ) ۽ هڪ نئون ڪنيڪشن ٺاهيو: "جاوا پروجيڪٽ A کان Z تائين": ڊيٽابيس سان لاڳاپيل سڀ ڪجهه شامل ڪرڻ.  حصو 1 - 3اسان کي هيٺين فيلڊ ڀرڻ جي ضرورت آهي:
  • ڪنيڪشن جو نالو - ڪنيڪشن جو نالو - اختياري طور تي، DEV_JRTB_DB؛
  • ميزبان نالو - ھتي اھو پتو آھي جتي ڊيٽابيس ٺھيل آھي. اسان جي حالت ۾، سڀ ڪجھ ائين ئي رهندو جيئن هو: 127.0.0.1 ، يا localhost؛
  • يوزرنيم - هتي روٽ هوندو، جيئن اسان ڊاڪر-compose ۾ لکيو آهي؛
  • پاسورڊ - پڻ روٽ.
هن کان پوء، توهان کي چيڪ ڪرڻ جي ضرورت آهي ته ڪو ڪنيڪشن آهي. ائين ڪرڻ لاءِ، ٽيسٽ ڪنيڪشن تي ڪلڪ ڪريو : "جاوا پروجيڪٽ A کان Z تائين": ڊيٽابيس سان لاڳاپيل سڀ ڪجهه شامل ڪرڻ.  حصو 1 - 4نتيجي طور، اسان حاصل ڪيو: MySQL سان ڳنڍڻ ۾ ناڪام ٿيو... ڇو؟ اسان ٽرمينل ڏانھن وڃون ٿا ۽ ڏسو ته ڊاڪر ڪنٽينر کي ڇا ٿيو. اچو ته ٽرمينل ۾ لکون: "جاوا پروجيڪٽ A کان Z تائين": ڊيٽابيس سان لاڳاپيل سڀ ڪجهه شامل ڪرڻ.  حصو 1 - 5اسان ڏسون ٿا ته ٽرمينل 59 منٽ اڳ ٺهيل هو، ۽ ٻيهر شروع ٿيڻ ۾ 55 سيڪنڊ هئا... ڇو؟ اهو واضح ناهي، توهان کي لاگ ان کي ڏسڻ جي ضرورت آهي. ٽرمينل ۾ پروجيڪٽ جي روٽ ڏانھن وڃو ۽ ھيٺ ڏنل حڪم ھلايو: docker-compose -f docker-compose-test.yml logs
اسان حاصل ڪريون ٿا:

dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:28+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:30+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:32+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:34+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:37+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:44+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:58+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

هاڻي اهو واضح آهي ته ڊيٽابيس ڪڏهن به اسان جي سيٽنگن سان شروع نه ڪيو. غلطي ساڳي آهي، تنهنڪري اچو ته ان کي شيٽ کان الڳ ڪريون:
2021-02-28 11:03:37+00:00 [ERROR] [انٽري پوائنٽ]: ڊيٽابيس غير شروع ٿيل آهي ۽ پاسورڊ آپشن جي وضاحت نه ڪئي وئي آهي dev-jrtb-db | توھان کي ھڪڙي وضاحت ڪرڻ جي ضرورت آھي MYSQL_ROOT_PASSWORD، MYSQL_ALLOW_EMPTY_PASSWORD ۽ MYSQL_RANDOM_ROOT_PASSWORD
اهو آهي، هن کي روٽ استعمال ڪندڙ لاء پاسورڊ مقرر ڪرڻ جي ضرورت آهي - مکيه صارف. ٺيڪ، هاڻي اسان پنهنجي فائل کي اپڊيٽ ڪنداسين:
version: '3.1'

services:
 jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_ROOT_PASSWORD: root
اسان صارف ۽ پاسورڊ لاءِ انھن متغيرن کي ختم ڪيو ۽ روٽ استعمال ڪندڙ لاءِ صرف پاسورڊ شامل ڪيو. هن جو مطلب اهو آهي ته روٽ استعمال ڪندڙ کي هاڻي روٽ پاسورڊ هوندو. گهٽ ۾ گهٽ اهو آهي جيڪو اسان فرض ڪريون ٿا. هاڻي اچو ته ان کي هلون ۽ ڏسو ته ڇا ٿئي ٿو: docker-compose -f docker-compose-test.yml up -d ۽ فوري طور تي ڏسو ته لاگ اسان کي ڇا ٿا چون: docker-compose -f docker-compose-test.yml لاگ
اچو ته ڏسون:

Attaching to dev-jrtb-db dev-jrtb-db | 2021-02-28 11:20:40+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Initializing database files dev-jrtb-db | 2021-02-28T11:20:41.083803Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.23) initializing of server in progress as process 43 dev-jrtb-db | 2021-02-28T11:20:41.088457Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:41.447990Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:42.672093Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. dev-jrtb-db | 2021-02-28 11:20:45+00:00 [Note] [Entrypoint]: Database files initialized dev-jrtb-db | 2021-02-28 11:20:45+00:00 [Note] [Entrypoint]: Starting temporary server dev-jrtb-db | 2021-02-28T11:20:45.893664Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 88 dev-jrtb-db | 2021-02-28T11:20:45.921695Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:46.088339Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:46.207499Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock dev-jrtb-db | 2021-02-28T11:20:46.369170Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. dev-jrtb-db | 2021-02-28T11:20:46.369357Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. dev-jrtb-db | 2021-02-28T11:20:46.371501Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. dev-jrtb-db | 2021-02-28T11:20:46.402227Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 0 MySQL Community Server - GPL. dev-jrtb-db | 2021-02-28 11:20:46+00:00 [Note] [Entrypoint]: Temporary server started. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it. dev-jrtb-db | 2021-02-28 11:20:49+00:00 [Note] [Entrypoint]: Creating database dev_jrtb_db dev-jrtb-db | dev-jrtb-db | 2021-02-28 11:20:49+00:00 [Note] [Entrypoint]: Stopping temporary server dev-jrtb-db | 2021-02-28T11:20:49.187996Z 11 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.23). dev-jrtb-db | 2021-02-28T11:20:50.925075Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.23) MySQL Community Server - GPL. dev-jrtb-db | 2021-02-28 11:20:51+00:00 [Note] [Entrypoint]: Temporary server stopped dev-jrtb-db | dev-jrtb-db | 2021-02-28 11:20:51+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up. dev-jrtb-db | dev-jrtb-db | 2021-02-28T11:20:51.420058Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 1 dev-jrtb-db | 2021-02-28T11:20:51.427384Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:51.577244Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:51.677659Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock dev-jrtb-db | 2021-02-28T11:20:51.787156Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. dev-jrtb-db | 2021-02-28T11:20:51.787325Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. dev-jrtb-db | 2021-02-28T11:20:51.789742Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. dev-jrtb-db | 2021-02-28T11:20:51.812100Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.

لڳي ٿو ته هاڻي ڪو به نقص نه آهي، تنهنڪري توهان ڏسي سگهو ٿا ته اتي رسائي هوندي. پر، بدقسمتي سان، ٻيهر ڪابه رسائي نه آهي ... ڪجھ به نه: اسان ان کي اڳتي وڌائينداسين! "جاوا پروجيڪٽ A کان Z تائين": ڊيٽابيس سان لاڳاپيل سڀ ڪجهه شامل ڪرڻ.  حصو 1 - 6docker-compose کي ختم ڪرڻ ۽ سڀني ڪنٽينرز کي حذف ڪرڻ لاءِ، توهان کي لکڻو پوندو: docker-compose -f docker-compose-test.yml down هتي اسان فائل کي حذف ڪرڻ جي وضاحت ڪئي آهي. ڇا ڪجي؟ اچو ته ان کي گوگل ڪريون: ٿي سگهي ٿو ڪنهن ان کي بهتر ڪيو آهي. آسان ترين سوال: ”ڊاڪر-ڪمپوز ۾ mysql جو مثال“ اسان کي وچولي وسيلن جي لنڪ ڳولڻ ۾ مدد ڪري ٿي. اهي هي مثال ڏين ٿا:
version: '3.3'
services:
 db:
   image: mysql:5.7
   restart: always
   environment:
     MYSQL_DATABASE: 'db'
     # So you don't have to use root, but you can if you like
     MYSQL_USER: 'user'
     # You can use whatever password you like
     MYSQL_PASSWORD: 'password'
     # Password for root access
     MYSQL_ROOT_PASSWORD: 'password'
   ports:
     # <Port exposed> : < MySQL Port running inside container>
     - '3306:3306'
   expose:
     # Opens port 3306 on the container
     - '3306'
     # Where our data will be persisted
   volumes:
     - my-db:/var/lib/mysql
# Names our volume
volumes:
 my-db:
اسان ان کي اسان جي ضرورتن مطابق ٺاهيندا آهيون ۽ حاصل ڪندا آهيون:
version: '3.1'

services:
 jrtb-db:
   image: mysql:5.7
   restart: always
   environment:
     MYSQL_DATABASE: 'dev_jrtb_db'
     # So you don't have to use root, but you can if you like
     MYSQL_USER: 'dev_jrtb_db_user'
     # You can use whatever password you like
     MYSQL_PASSWORD: 'dev_jrtb_db_password'
     # Password for root access
     MYSQL_ROOT_PASSWORD: 'root'
   ports:
     # <Port exposed> : < MySQL Port running inside container>
     - '3306:3306'
   expose:
       # Opens port 3306 on the container
       - '3306'
اسان هن آپشن کي شروع ڪريون ٿا ان ڪمانڊ سان جيڪو اسان کي اڳ ۾ ئي معلوم آهي: docker-compose -f docker-compose-test.yml up -d اسان ٻيهر ڪوشش ڪريون ٿا ڊيٽابيس تائين رسائي جي MySQLWorkBench ذريعي: "جاوا پروجيڪٽ A کان Z تائين": ڊيٽابيس سان لاڳاپيل سڀ ڪجهه شامل ڪرڻ.  حصو 1 - 7آخرڪار، رسائي ظاهر ٿي وئي آهي. پر هاڻي مان حيران آهيان ته ان تي اثر ڇا ٿيو. مان هن حصي تي گناهه ڪري رهيو آهيان:
expose:
   # Opens port 3306 on the container
   - '3306'
اهو چيڪ ڪرڻ آسان آهي: ان کان سواء، ڪجھ به ڪم نه ڪرڻ گهرجي: ڊي. اچو ته چيڪ ڪريو: هن حصي کي حذف ڪريو، ٻيهر شروع ڪريو docker-compose: docker-compose -f docker-compose-test.yml down docker-compose -f docker-compose-test.yml up اسان ڊيٽابيس ۾ لاگ ان ٿيڻ جي ڪوشش ڪريون ٿا ورڪ بينچ ذريعي: سڀ ڪجھ ڪم ڪري ٿو . پوء صرف اختيار ڊيٽابيس ورزن آهي. اهو واضح طور تي 5.7 بيان ڪري ٿو، اهو آهي، جيڪڏهن توهان ان کي جديد ۾ تبديل ڪيو، اهو ڪم نه ڪرڻ گهرجي. مون ان کي ٻيهر شروع ڪيو - ۽ اهو واقعي ڪم نٿو ڪري ... "جاوا پروجيڪٽ A کان Z تائين": ڊيٽابيس سان لاڳاپيل سڀ ڪجهه شامل ڪرڻ.  حصو 1 - 8ظاهر آهي، انهن کي تازو ورزن تي ڊاکر تصوير سان ڪجهه مسئلا آهن. ٺيڪ آهي، ڪو مسئلو ناهي. اهو اڪثر ڪري ٿو مفت سافٽ ويئر سان. اسان ورزن 5.7 استعمال ڪنداسين. اچو ته ڏسون ته ڇا ھڪڙو ڊيٽابيس آھي جنھن جي اسان کي ضرورت آھي - dev_jrtb_db. ائين ڪرڻ لاءِ، MySQL Workbench ۾ Query ڪمانڊ SHOW DATABASES : "جاوا پروجيڪٽ A کان Z تائين": ڊيٽابيس سان لاڳاپيل سڀ ڪجهه شامل ڪرڻ.  حصو 1 - 9ھائو، اھو آئوٽ پٽ ۾ موجود آھي. عظيم، اسان اڳتي وڌي سگهون ٿا. اڳيون، اچو ته اسان جي پهرين لڏپلاڻ کي شامل ڪريو. آرٽيڪل جي ڪمن جي بنياد تي "پروجيڪٽ پلاننگ: ماپ ٻه ڀيرا، هڪ ڀيرو ڪٽيو،" اسان اسان جي پهرين ٽيبل tg_user ٺاهينداسين. سڀ لڏپلاڻ پروجيڪٽ ۾ واقع ٿينديون ڊير/src/main/resources/db/migration فولڊر ، ۽ نالو ٿيندو: V00001__add_tg_user_table.sql . ان فولڊر ۾ اهڙو نالو ڇو آهي - مون ان کي بهار + فلائي وي بابت مضمون ۾ بيان ڪيو آهي. اها آهي جيڪا اسان جي پهرين لڏپلاڻ وانگر نظر ايندي: V00001__add_tg_user_table.sql:
-- ensure that the table with this name is removed before creating a new one.
DROP TABLE IF EXISTS tg_user;

-- Create tg_user table
CREATE TABLE tg_user (
   chat_id VARCHAR(100),
   active BOOLEAN
);
اهو آهي، هتي اسان صرف هڪ صارف جو هڪ ٽيبل ٺاهيو جنهن وٽ صرف هڪ چيٽ ID آهي (هڪ منفرد عنصر جيڪو ٽيبل ۾ ID طور ڪم ڪرڻ لاء استعمال ڪري سگهجي ٿو) ۽ ان جي حالت - فعال يا غير فعال. تنهن ڪري، جيڪڏهن بوٽ کي روڪيو ويو آهي، رڪنيت جي معلومات رهندي ۽ استعمال ڪري سگهجي ٿي جيڪڏهن اهي بوٽ ٻيهر استعمال ڪرڻ چاهيندا. في الحال استعمال ڪندڙ جي باري ۾ ڪا ٻي معلومات جي ضرورت ناهي. هاڻي بنيادي سوال: اهو ڪيئن چيڪ ڪجي؟ اسان کي اسان جي اپليڪيشن شروع ڪرڻ جي ضرورت آهي. هينئر تائين، مکيه docker-compose.yml فائل جو ڊيٽابيس سان ڪو به واسطو ناهي، ۽ اسان کي اهو به سکڻو پوندو ته ڊيٽابيس سان گڏ ايپليڪيشن کي ڊيبگ ڪيئن ڪجي. تنهن ڪري، اچو ته انٽيليج IDEA سان ايپليڪيشن لانچ ڪريون. ھن کي جانچڻ لاءِ اسان کي پنھنجي مکيه طريقي کي هلائڻو پوندو JavarushTelegramBotApplication. مقرري ۽ جانچ جي ڪم کي الڳ ڪرڻ لاءِ، اسان هڪ ٻي فائل استعمال ڪنداسين ملڪيتن سان - application-test.properties . هن ٽيمپليٽ سان اسان Spring کي خبر ڏيون ٿا ته هي فائل ٽيسٽ پروفائيل لاءِ استعمال ٿيندي . جڏهن اسان پروفائل جي وضاحت نه ڪندا آهيون، ڊفالٽ پروفائل استعمال ڪيو ويندو آهي (هن کي چيڪ ڪريو توهان جي لاگن ۾ جڏهن اسپرنگ بوٽ هلائي رهيا آهيو: ان بابت پهرين لائنن ۾ لکيو ويندو). اھو اھو آھي جيڪو اھو نظر ايندو:
# MySQL configurations:
spring.datasource.url=jdbc:mysql://localhost:3306/dev_jrtb_db
spring.datasource.username=dev_jrtb_db_user
spring.datasource.password=dev_jrtb_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# TelegramBot configurations:
bot.username=tes
bot.token=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
۽ مکيه application.properties ٿورو مختلف نظر ايندو:
# MySQL configurations:
spring.datasource.url=jdbc:mysql://jrtb-db:3306/jrtb_db
spring.datasource.username=jrtb_db_user
spring.datasource.password=jrtb_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# TelegramBot configurations:
bot.username=test.javarush_community_bot
bot.token=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
اهم فرق spring.datasource.url فيلڊ ۾ آهي: ٽيسٽ پروفائل ۾ اسان وٽ URL آهي localhost . اهو آهي، ايپليڪيشن جي توقع ڪئي وئي آهي ڊڪر کان ٻاهر هلڻ، جيڪو صحيح آهي، ڇاڪاڻ ته جڏهن ڊيبگنگ ڪندي اسان پنهنجي پروجيڪٽ کي Intellij IDEA ۾ هلائينداسين ۽ اميد رکون ٿا ته اسان وٽ مقامي مشين کان ڊيٽابيس تائين رسائي هوندي. پر application.properties URL ۾ اڳ ۾ ئي هڪ مختلف آهي - jrtb-db . اهو اسان جي ڊيٽابيس جو نالو docker-compose ۾ هوندو، ۽ اهڙي طرح اسان جي ڊڪر ايپليڪيشن ڊيٽابيس تائين پهچي سگهندي. ڇو؟ تنهن ڪري، اهي هڪ ئي ڊاکر-ڪپوز ۾ لانچ ڪندا ۽ هڪ ٻئي جي باري ۾ ڄاڻندا. اهو ضروري آهي ته اسان وٽ منصوبي لاء هڪ بند انفراسٽرڪچر آهي. پر شروعات ۾ پروفائل ڪيئن شروع ڪجي؟ هن کي ڪرڻ لاء، توهان Intellij IDEA ۾ مکيه طريقي جي لانچ کي ترتيب ڏئي سگهو ٿا. ان لاءِ، اتي آهي ايڊٽ ڪنفيگريشن : JavarushTelegramBotApplication جي مکيه ڪلاس ۾ وڃو، مکيه طريقي جي اعلان جي اڳيان سائي تير تي ڪلڪ ڪريو ۽ تبديل ڪريو رن ڪنفيگريشن کي چونڊيو : "جاوا پروجيڪٽ A کان Z تائين": ڊيٽابيس سان لاڳاپيل سڀ ڪجهه شامل ڪرڻ.  حصو 1 - 10ضروري متغير داخل ڪريو ۽ پروفائل ترتيب ڏيو. Intellij IDEA ۾، هن ڪنفيگريشن ونڊو جو انٽرفيس ٿورو تبديل ٿي چڪو آهي، تنهن ڪري مان هر ڪنهن کي مشورو ڏيان ٿو ته IDEA کي جديد ورزن ۾ تازه ڪاري ڪري ته جيئن اسان ساڳي تصوير ڏسون: ماحولياتي متغير جي"جاوا پروجيڪٽ A کان Z تائين": ڊيٽابيس سان لاڳاپيل سڀ ڪجهه شامل ڪرڻ.  حصو 1 - 11 فيلڊ ۾ ، اسان کي بوٽ جو نالو ۽ ٽوڪن متغير استعمال ڪرڻ جي ضرورت آهي. هيٺيون ٽيمپليٽ: variable_name1=value1؛ variable_name2=value2 . اھو آھي، key=value سيميڪولن سان جدا ٿيل آھن. اسان جي حالت ۾ اهو هن طرح ٿيندو: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (توهان وٽ هڪ مختلف نالو هوندو ۽ بوٽ لاءِ ٽوڪن) اڳتي، منتخب ڪريو شامل ڪريو VM آپشنز فيلڊ ۾ تبديل ڪريو بٽڻ : Write بٽڻ : -Dspring.profiles.active=test - هي SpringBoot کي ٻڌائيندو ته ٽيسٽ پروفائيل استعمال ڪرڻ لاءِ، جنهن جو مطلب آهي ته خاصيتون application-test.properties مان ورتيون وينديون. نتيجي طور، اھو ھن طرح نظر ايندو: ھاڻي اسان پنھنجي ٽيسٽ ڊيٽابيس کي لانچ ڪريون ٿا: docker-compose -f docker-compose-test.yml up ۽ بلڪل ھن طرح، بغير -d جي اڳيئي جي، ته جيئن لاگ ان کي فوري طور تي ڏسي سگھجي ٿو. ٽرمينل، جيڪڏهن ڪنهن کي ضرورت هجي. ۽ آخري قدم صرف مکيه طريقو هلائڻ لاء آهي. جيڪڏھن توھان سڀ ڪجھ اھڙيءَ طرح ڪندا آھيو جيئن مون بيان ڪيو آھي، توھان کي ختم ڪيو ويندو: لاگن جي ٻي لائن ھڪڙي وضاحت ڪئي ويندي جيڪا ٽيسٽ پروفائل ڪمائي آھي. اسان MySQLWorkbench ذريعي وڃون ٿا ۽ چيڪ ڪرڻ لاءِ ٻه ڪمانڊ هلون ٿا ته لڏپلاڻ ختم ٿي وئي آهي ۽ هر شي ڪم ڪري رهي آهي (جيتوڻيڪ هي ايپليڪيشن لانچ لاگز مان نظر اچي ٿو، اهو ضرور جانچڻ جي لائق آهي):"جاوا پروجيڪٽ A کان Z تائين": ڊيٽابيس سان لاڳاپيل سڀ ڪجهه شامل ڪرڻ.  حصو 1 - 12"جاوا پروجيڪٽ A کان Z تائين": ڊيٽابيس سان لاڳاپيل سڀ ڪجهه شامل ڪرڻ.  حصو 1 - 13"جاوا پروجيڪٽ A کان Z تائين": ڊيٽابيس سان لاڳاپيل سڀ ڪجهه شامل ڪرڻ.  حصو 1 - 14
  1. dev_jrtb_db استعمال ڪريو؛
  2. ٽيبل ڏيکاريو؛
نتيجو: "جاوا پروجيڪٽ A کان Z تائين": ڊيٽابيس سان لاڳاپيل سڀ ڪجهه شامل ڪرڻ.  حصو 1 - 15جيئن اسان توقع ڪئي، اسان کي ٻه ٽيبل مليا. پهرين لڏپلاڻ لاءِ اڪائونٽنگ لاءِ ٽيڪنيڪل آهي، ٻيو ٽيليگرام استعمال ڪندڙن لاءِ اسان جي ٽيبل آهي. سڀ: Flyway سان گڏ ڊيٽابيس شامل ڪيو ويو آهي. ھاڻي نيون لڏپلاڻ گھڙي جي ڪم وانگر ٿيندي. سڀ کان ڏکيو شيء پهريون سيٽ اپ ۽ عمل جي شروعات آهي. تسلسل ۾ ، اسان هن عالمي ڪم تي ڪم مڪمل ڪري رهيا آهيون: docker-compose.yml ۾ ڊيٽابيس شامل ڪرڻ، ريپوزٽري پرت شامل ڪرڻ، بوٽ لاءِ انگ اکر، ٽيسٽ ۽ دستاويز لکڻ ۽ تازه ڪاري ڪرڻ.

سيريز ۾ سڀني مواد جي هڪ فهرست هن مضمون جي شروعات ۾ آهي.

تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION