ЗапускаСм Jupyter Π½Π° ΠΎΡ€Π±ΠΈΡ‚Ρƒ LXD

ΠŸΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π»ΠΈ Π²Π°ΠΌ ΡΠΊΡΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΊΠΎΠ΄ΠΎΠΌ ΠΈΠ»ΠΈ систСмными ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°ΠΌΠΈ Π² Linux Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Ρ‚Ρ€ΡΡΡ‚ΠΈΡΡŒ Π·Π° Π±Π°Π·ΠΎΠ²ΡƒΡŽ систСму ΠΈ Π½Π΅ снСсти всё с ΠΏΠΎΡ‚Ρ€ΠΎΡ…Π°ΠΌΠΈ Π² случаС ошибки ΠΊΠΎΠ΄Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ запустится с root-привилСгиями?

А ΠΊΠ°ΠΊ Π½Π° счСт Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ допустим, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΉ кластСр Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Ρ… микросСрвисов Π½Π° ΠΎΠ΄Π½ΠΎΠΉ машинС? Π‘ΠΎΡ‚Π½ΡŽ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ тысячу?

Π‘ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ машинами управляСмыС Π³ΠΈΠΏΠ΅Ρ€Π²ΠΈΠ·ΠΎΡ€ΠΎΠΌ Ρ‚Π°ΠΊΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ получится, Π½ΠΎ ΠΊΠ°ΠΊΠΎΠΉ Ρ†Π΅Π½ΠΎΠΉ? НапримСр, ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π² LXD Π½Π° Π±Π°Π·Π΅ дистрибутива Alpine Linux минимально потрСбляСт всСго 7.60MB ΠžΠ—Π£, ΠΈ Π³Π΄Π΅ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Ρ€Π°Π·Π΄Π΅Π» послС запуска Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 9.5MB! Как Ρ‚Π΅Π±Π΅ Ρ‚Π°ΠΊΠΎΠ΅, Илон Маск? Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ возмоТностями LXD β€” систСмы ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π² Linux

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π² Ρ†Π΅Π»ΠΎΠΌ стало ясно, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ LXD, ΠΏΠΎΠΉΠ΄Π΅ΠΌ дальшС ΠΈ ΠΏΠΎΠ΄ΡƒΠΌΠ°Π΅ΠΌ, Π° Ρ‡Ρ‚ΠΎ, Ссли Π±Ρ‹ Π±Ρ‹Π»Π° такая ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°-ΠΊΠΎΠΌΠ±Π°ΠΉΠ½, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ бСзопасно Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ для хоста, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ, динамичСски (ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ) ΡΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ UI-Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ с Ρ‚Π²ΠΎΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ, Π΄ΠΎΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠ΄ тСкстом с Π±Π»Π΅ΠΊΠ΄ΠΆΠ΅ΠΊΠΎΠΌ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ? Π§Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠ³Π°? Вауу… Π₯ΠΎΡ‡Ρƒ! Π₯ΠΎΡ‡Ρƒ! πŸ™‚

Заглядывай ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚ Π³Π΄Π΅ ΠΌΡ‹ запустим Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ JupyterLab β€” ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса вмСсто ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅Π³ΠΎ Jupyter Notebook, Π° Ρ‚Π°ΠΊΠΆΠ΅ установим Ρ‚Π°ΠΊΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Python ΠΊΠ°ΠΊ NumPy, Pandas, Matplotlib, IPyWidgets ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ позволят Π²Ρ‹Ρ‚Π²ΠΎΡ€ΡΡ‚ΡŒ всё пСрСчислСнноС Π²Ρ‹ΡˆΠ΅ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ это всё Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ β€” IPython-Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠ΅.

ЗапускаСм Jupyter Π½Π° ΠΎΡ€Π±ΠΈΡ‚Ρƒ LXD

План Π²Π·Π»Ρ‘Ρ‚Π° Π½Π° ΠΎΡ€Π±ΠΈΡ‚Ρƒ ^

ЗапускаСм Jupyter Π½Π° ΠΎΡ€Π±ΠΈΡ‚Ρƒ LXD

НакидаСм ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΏΠ»Π°Π½ дСйствий, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΌ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ схСму Π²Ρ‹ΡˆΠ΅:

  • Установим ΠΈ запустим ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π½Π° Π±Π°Π·Π΅ дистрибутива Alpine Linux. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот дистрибутив Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π½Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ установим Π² Π½Π΅Π³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ самый Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ софт, Π½ΠΈΡ‡Π΅Π³ΠΎ лишнСго.
  • Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ диск Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π·Π°Π΄Π°Π΄ΠΈΠΌ имя β€” hostfs ΠΈ смонтируСм ΠΊ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Π€Π‘. Π­Ρ‚ΠΎΡ‚ диск даст Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π° хостС ΠΈΠ· Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. Π’Π΅ΠΌ самым Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρƒ нас нСзависимы ΠΎΡ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. Π’ случаС удалСния ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡΡ‚Π°Π½ΡƒΡ‚ΡŒΡΡ Π½Π° хостС. Π’Π°ΠΊΠΆΠ΅, эта схСма ΠΏΠΎΠ»Π΅Π·Π½Π° для раздСлСния ΠΎΠ΄Π½ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡˆΡ‚Π°Ρ‚Π½Ρ‹Π΅ сСтСвыС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ дистрибутива ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.
  • Установим Bash, sudo, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΈ настроим систСмного ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
  • Установим Python, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ скомпилируСм для Π½ΠΈΡ… Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ зависимости
  • Установим ΠΈ запустим JupyterLab, настроим внСшний Π²ΠΈΠ΄, установим Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ для Π½Π΅Π³ΠΎ.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ с Π²Π°ΠΌΠΈ Π½Π°Ρ‡Π½Ρ‘ΠΌ с запуска ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ установку ΠΈ настройку LXD, всё это Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ β€” Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ возмоТности LXD β€” систСмы ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π² Linux.

Установка ΠΈ настройка Π±Π°Π·ΠΎΠ²ΠΎΠΉ систСмы ^

Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΎΠ±Ρ€Π°Π· β€” alpine3, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° β€” jupyterlab ΠΈ ΠΏΡ€ΠΈ нСобходимости ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

lxc init alpine3 jupyterlab --profile=default --profile=hddroot

Π—Π΄Π΅ΡΡŒ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ hddroot ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с root-Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ Π² Storage Pool располоТСнным Π½Π° физичСском HDD дискС:

lxc profile show hddroot

config: {}
description: ""
devices:
  root:
    path: /
    pool: hddpool
    type: disk
name: hddroot
used_by: []
lxc storage show hddpool

config:
  size: 10GB
  source: /dev/loop1
  volatile.initial_source: /dev/loop1
description: ""
name: hddpool
driver: btrfs
used_by:
- /1.0/images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
- /1.0/profiles/hddroot
status: Created
locations:
- none

Π­Ρ‚ΠΎ Π΄Π°Ρ‘Ρ‚ ΠΌΠ½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΊΡΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ Π½Π° HDD дискС экономя рСсурсы SSD диска ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ имССтся Π² ΠΌΠΎΠ΅ΠΉ систСмС πŸ™‚ для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρƒ мСня создан ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ssdroot.

ПослС создания ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΎΠ½ находится Π² состоянии STOPPED, поэтому Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π΅Π³ΠΎ ΡΡ‚Π°Ρ€Ρ‚Π°Π½ΡƒΡ‚ΡŒ запустив Π² Π½Ρ‘ΠΌ init-систСму:

lxc start jupyterlab

Π’Ρ‹Π²Π΅Π΄Π΅ΠΌ список ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π² LXD ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ»ΡŽΡ‡ -c ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΊΠΈΠ΅ columns вывСсти Π½Π° экран:

lxc list -c ns4b
+------------+---------+-------------------+--------------+
|    NAME    |  STATE  |       IPV4        | STORAGE POOL |
+------------+---------+-------------------+--------------+
| jupyterlab | RUNNING | 10.0.5.198 (eth0) | hddpool      |
+------------+---------+-------------------+--------------+

ΠŸΡ€ΠΈ создании ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° IP адрСс выбрался случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ использовали ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ default ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Ρ€Π°Π½Π΅Π΅ сконфигурирован Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ возмоТности LXD β€” систСмы ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π² Linux.

ΠœΡ‹ помСняСм этот IP адрСс Π½Π° Π±ΠΎΠ»Π΅Π΅ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉΡΡ, создав сСтСвой интСрфСйс Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π° Π½Π΅ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ профиля ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊ это сСйчас Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ это.

Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ сСтСвой интСрфСйс eth0 ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»ΠΈΠ½ΠΊΡƒΠ΅ΠΌ с ΠΊΠΎΠΌΠΌΡƒΡ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ (сСтСвым мостом) lxdbr0 Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ NAT ΠΏΠΎ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρƒ сСйчас Π±ΡƒΠ΄Π΅Ρ‚ доступ Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚, Π° Ρ‚Π°ΠΊΠΆΠ΅ интСрфСйсу Π½Π°Π·Π½Π°Ρ‡Π°Π΅ΠΌ статичСский IP адрСс β€” 10.0.5.5:

lxc config device add jupyterlab eth0 nic name=eth0 nictype=bridged parent=lxdbr0 ipv4.address=10.0.5.5

ПослС добавлСния устройства, ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ:

lxc restart jupyterlab

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ статус ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°:

lxc list -c ns4b
+------------+---------+------------------+--------------+
|    NAME    |  STATE  |       IPV4       | STORAGE POOL |
+------------+---------+------------------+--------------+
| jupyterlab | RUNNING | 10.0.5.5 (eth0)  | hddpool      |
+------------+---------+------------------+--------------+

Установка Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ софта ΠΈ настройка систСмы ^

Для администрирования нашСго ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ софт:

Package
Description

bash
The GNU Bourne Again shell

bash-completion
Programmable completion for the bash shell

sudo
Give certain users the ability to run some commands as root

shadow
Password and account management tool suite with support for shadow files and PAM

tzdata
Sources for time zone and daylight saving time data

nano
Pico editor clone with enhancements

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π² систСмС man-pages установив ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ β€” man man-pages mdocml-apropos less

lxc exec jupyterlab -- apk add bash bash-completion sudo shadow tzdata nano

Π Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ использовали:

  • lxc β€” Π’Ρ‹Π·ΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° LXD
  • exec β€” ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° LXD, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСт ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅
  • jupyterlab β€” Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°
  • -- β€” Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ дальшС ΠΊΠ»ΡŽΡ‡ΠΈ ΠΊΠ°ΠΊ ΠΊΠ»ΡŽΡ‡ΠΈ для lxc ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ всю ΠΎΡΡ‚Π°Π²ΡˆΡƒΡŽΡΡ строку ΠΊΠ°ΠΊ Π΅ΡΡ‚ΡŒ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€
  • apk β€” ΠŸΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ дистрибутива Alpine Linux
  • add β€” ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ инсталлируСт ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ послС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹

Π”Π°Π»Π΅Π΅, установим Π² систСмС Ρ‚Π°ΠΉΠΌ-Π·ΠΎΠ½Ρƒ Europe/Moscow:

lxc exec jupyterlab -- cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime

ПослС установки Ρ‚Π°ΠΉΠΌ-Π·ΠΎΠ½Ρ‹, ΠΏΠ°ΠΊΠ΅Ρ‚ tzdata Π² систСмС большС Π½Π΅ Π½ΡƒΠΆΠ΅Π½, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ мСсто, поэтому, ΡƒΠ΄Π°Π»ΠΈΠΌ Π΅Π³ΠΎ:

lxc exec jupyterlab -- apk del tzdata

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Ρ‚Π°ΠΉΠΌ-Π·ΠΎΠ½Ρƒ:

lxc exec jupyterlab -- date

Wed Apr 15 10:49:56 MSK 2020

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° настройку Bash для Π½ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ дСйствиями, ΠΌΡ‹ скопируСм Π² Π½Π΅Π³ΠΎ ΠΈΠ· хостовой систСмы ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ skel-Ρ„Π°ΠΉΠ»Ρ‹. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΡ€Π΅ΡƒΠΊΡ€Π°ΡΠΈΡ‚ΡŒ Bash Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Π² ΠΈΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π£ мСня хостовая систСма β€” Manjaro Linux ΠΈ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ /etc/skel/.bash_profile, /etc/skel/.bashrc, /etc/skel/.dir_colors Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ подходят ΠΊ Alpine Linux ΠΈ критичСских ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚, Π½ΠΎ Ρƒ вас это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ дистрибутив ΠΈ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² случаС ошибки запускаСмого Bash Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅.

ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ skel-Ρ„Π°ΠΉΠ»Ρ‹ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€. ΠšΠ»ΡŽΡ‡ --create-dirs создаст Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, Ссли ΠΎΠ½ΠΈ Π½Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚:

lxc file push /etc/skel/.bash_profile jupyterlab/etc/skel/.bash_profile --create-dirs
lxc file push /etc/skel/.bashrc jupyterlab/etc/skel/.bashrc
lxc file push /etc/skel/.dir_colors jupyterlab/etc/skel/.dir_colors

Для ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ root-ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ скопируСм Π² домашнюю Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ скопированныС Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ skel-Ρ„Π°ΠΉΠ»Ρ‹:

lxc exec jupyterlab -- cp /etc/skel/.bash_profile /root/.bash_profile
lxc exec jupyterlab -- cp /etc/skel/.bashrc /root/.bashrc
lxc exec jupyterlab -- cp /etc/skel/.dir_colors /root/.dir_colors

Π’ Alpine Linux для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ устанавливаСтся систСмная ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° /bin/sh, ΠΌΡ‹ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π΅Ρ‘ Ρƒ root ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° Bash:

lxc exec jupyterlab -- usermod --shell=/bin/bash root

Π§Ρ‚ΠΎΠ±Ρ‹ root ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π±Ρ‹Π» Π±Π΅ΡΠΏΠ°Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ, Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° сгСнСрируСт ΠΈ установит Π΅ΠΌΡƒ Π½ΠΎΠ²Ρ‹ΠΉ случайный ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π½Π° экранС консоли послС Π΅Ρ‘ выполнСния:

lxc exec jupyterlab -- /bin/bash -c "PASSWD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12); echo "root:$PASSWD" | chpasswd && echo "New Password: $PASSWD""

New Password: sFiXEvBswuWA

Π’Π°ΠΊΠΆΠ΅, создадим Π½ΠΎΠ²ΠΎΠ³ΠΎ систСмного ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ β€” jupyter для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎΠ·ΠΆΠ΅ настроим JupyterLab:

lxc exec jupyterlab -- useradd --create-home --shell=/bin/bash jupyter

Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈ установим Π΅ΠΌΡƒ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ:

lxc exec jupyterlab -- /bin/bash -c "PASSWD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12); echo "jupyter:$PASSWD" | chpasswd && echo "New Password: $PASSWD""

New Password: ZIcbzWrF8tki

Π”Π°Π»Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, пСрвая создаст ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ sudo, Π° вторая Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ Π² Π½Π΅Ρ‘ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ jupyter:

lxc exec jupyterlab -- groupadd --system sudo
lxc exec jupyterlab -- groupmems --group sudo --add jupyter

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Π² ΠΊΠ°ΠΊΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ jupyter:

lxc exec jupyterlab -- id -Gn jupyter

jupyter sudo

Всё β€” ΠΎΠΊ, двигаСмся дальшС.

Π Π°Π·Ρ€Π΅ΡˆΠΈΠΌ всСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ входят Π² Π³Ρ€ΡƒΠΏΠΏΡƒ sudo ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ sudo. Для этого Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ скрипт, Π³Π΄Π΅ sed раскоммСнтируСт строчку ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ /etc/sudoers:

lxc exec jupyterlab -- /bin/bash -c "sed --in-place -e '/^#[ t]*%sudo[ t]*ALL=(ALL)[ t]*ALL$/ s/^[# ]*//' /etc/sudoers"

Установка ΠΈ настройка JupyterLab ^

JupyterLab β€” это Python ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, поэтому ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅ΠΆΠ΄Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ этот ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€. Π’Π°ΠΊΠΆΠ΅, JupyterLab ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ питоновского ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° pip, Π° Π½Π΅ систСмного, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² систСмном Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ, ΠΈ поэтому, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ зависимости для Π½Π΅Π³ΠΎ установив ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ β€” python3 python3-dev gcc libc-dev zeromq-dev:

lxc exec jupyterlab -- apk add python3 python3-dev gcc libc-dev zeromq-dev

Обновим python-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ pip Π΄ΠΎ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ вСрсии:

lxc exec jupyterlab -- python3 -m pip install --upgrade pip setuptools wheel

УстанавливаСм JupyterLab Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ pip:

lxc exec jupyterlab -- python3 -m pip install jupyterlab

Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π² JupyterLab ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ вмСстС с ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ jupyterlab, поэтому, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ это Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

Установим NodeJS ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² для Π½Π΅Π³ΠΎ β€” NPM, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ JupyterLab ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΈΡ… для своих Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ:

lxc exec jupyterlab -- apk add nodejs npm

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ для JupyterLab ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ установим Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ, ΠΈΡ… Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ jupyter. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ запуска ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ воспринимаСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ окруТСния ΠΈ поэтому ΠΌΡ‹ Π΅Ρ‘ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ. Для этого, ΠΌΡ‹ ΠΏΡ€ΠΎΠΏΠΈΡˆΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ экспорта ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ JUPYTERLAB_DIR Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ jupyter, Π² Ρ„Π°ΠΉΠ» .bashrc, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² систСму:

lxc exec jupyterlab -- su -l jupyter -c "echo -e "nexport JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab" >> .bashrc"

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ установим ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ β€” ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Π² JupyterLab:

lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter labextension install --no-build @jupyter-widgets/jupyterlab-manager"

БСйчас ΡƒΠΆΠ΅ всё Π³ΠΎΡ‚ΠΎΠ²ΠΎ для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ запуска JupyterLab, Π½ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΅Ρ‰Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ нСсколько ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ:

  • toc β€” Table of Contents, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ список Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅/Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠ΅
  • jupyterlab-horizon-theme β€” Π’Π΅ΠΌΠ° оформлСния UI
  • jupyterlab_neon_theme β€” Π’Π΅ΠΌΠ° оформлСния UI
  • jupyterlab-ubu-theme β€” Π•Ρ‰Ρ‘ ΠΎΠ΄Π½Π° Ρ‚Π΅ΠΌΠ° оформлСния ΠΎΡ‚ Π°Π²Ρ‚ΠΎΡ€Π° этой ΡΡ‚Π°Ρ‚ΡŒΠΈ πŸ™‚ Но Π² этом случаС, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° установка ΠΈΠ· рСпозитория GitHub

Π˜Ρ‚Π°ΠΊ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ эти Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ:

lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter labextension install --no-build @jupyterlab/toc @mohirio/jupyterlab-horizon-theme @yeebc/jupyterlab_neon_theme"
lxc exec jupyterlab -- su -l jupyter -c "wget -c https://github.com/microcoder/jupyterlab-ubu-theme/archive/master.zip"
lxc exec jupyterlab -- su -l jupyter -c "unzip -q master.zip && rm master.zip"
lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter labextension install --no-build jupyterlab-ubu-theme-master"
lxc exec jupyterlab -- su -l jupyter -c "rm -r jupyterlab-ubu-theme-master"

ПослС установки Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡ… ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π°Π½Π΅Π΅, ΠΏΡ€ΠΈ установкС ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΈ ΠΊΠ»ΡŽΡ‡ --no-build для экономии Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. БСйчас ΠΌΡ‹ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ускоримся скомпилировав ΠΈΡ… вмСстС Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·:

lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter lab build"

БСйчас Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ запуска JupyterLab. МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π΅Π³ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ, Π½ΠΎ Π² этом случаС, ΠΊΠΎΠΌΠ°Π½Π΄Π° запуска, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π² ΡƒΠΌΠ΅ Ρ‚Ρ€ΡƒΠ΄ΠΎ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ, ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒΡΡ bash’Π΅ΠΌ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅, Π° Π½Π΅ Π½Π° хостС, Π³Π΄Π΅ ΠΈ Ρ‚Π°ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ для записи ΠΈΡ… Π² ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ πŸ™‚

Логинимся Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ jupyter:

lxc exec jupyterlab -- su -l jupyter

Π”Π°Π»Π΅Π΅ запуститС JupyterLab с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ:

[jupyter@jupyterlab ~]$ jupyter lab --ip=0.0.0.0 --no-browser

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² web-Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΏΠΎ адрСсу http://10.0.5.5:8888 ΠΈ Π½Π° ΠΎΡ‚ΠΊΡ€Ρ‹Π²ΡˆΠ΅ΠΉΡΡ страницС Π²Π²Π΅Π΄ΠΈΡ‚Π΅ token доступа ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π² консоли. Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ ΠΈ Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π½Π° страницС, Π·Π°Ρ‚Π΅ΠΌ Π½Π°ΠΆΠΌΠΈΡ‚Π΅ Login. ПослС Π²Ρ…ΠΎΠ΄Π°, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ слСва Π² мСню Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рисункС Π½ΠΈΠΆΠ΅, Π³Π΄Π΅ Π²Π°ΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ°Ρ‚ ΠΏΡ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π½Π° сСбя риски ΠΏΠΎ бСзопасности устанавливая Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΎΡ‚ Ρ‚Ρ€Π΅Ρ‚ΠΈΡ… Π»ΠΈΡ† Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° JupyterLab development отвСтствСнности Π½Π΅ нСсёт:

ЗапускаСм Jupyter Π½Π° ΠΎΡ€Π±ΠΈΡ‚Ρƒ LXD

Однако, ΠΌΡ‹ ΠΊΠ°ΠΊ Ρ€Π°Π· для этого ΠΈΠ·ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ JupyterLab ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π΅Π³ΠΎ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сторонниС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ NodeJS Π½Π΅ смогли ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΏΠΎΡ…ΠΈΡ‚ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° дискС ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°. Π”ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ ΠΊ вашим ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ Π½Π° хостС Π² /home процСссам ΠΈΠ· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° врядли получится, Π° Ссли ΠΈ получится, Ρ‚ΠΎ Π½Π° это Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ Π½Π° Ρ„Π°ΠΉΠ»Ρ‹ Π² хостовой систСмС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ запускаСм ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π² Π½Π΅ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· этой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ риск Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Π² JupyterLab.

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹Π΅ IPython-Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠΈ (страницы Π² JupyterLab) сСйчас Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² домашнСй Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ β€” /home/jupyter, Π½ΠΎ Π² Π½Π°ΡˆΠΈΡ… ΠΏΠ»Π°Π½Π°Ρ… Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ (Ρ€Π°ΡΡˆΠ°Ρ€ΠΈΡ‚ΡŒ) ΠΌΠ΅ΠΆΠ΄Ρƒ хостом ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ, поэтому, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ΡΡŒ Π² консоль ΠΈ остановитС JupyterLab Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² hotkey β€” CTRL+C ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠ² y Π½Π° запрос. Π—Π°Ρ‚Π΅ΠΌ Ρ€Π°Π·ΠΎΡ€Π²ΠΈΡ‚Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ ссСсию ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ jupyter Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Ρ…ΠΎΡ‚ΠΊΠ΅ΠΉ CTRL+D.

РаздСляСм Π΄Π°Π½Π½Ρ‹Π΅ с хостом ^

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ с хостом, Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Ρ‚Π°ΠΊΠΎΠ΅ устройство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ это позволяСт Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ для этого Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π³Π΄Π΅ ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡ΠΈ:

  • lxc config device add β€” Команда добавляСт ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ устройства
  • jupyter β€” Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ добавляСтся конфигурация
  • hostfs β€” Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ устройства. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ любоС имя.
  • disk β€” УказываСтся Ρ‚ΠΈΠΏ устройства
  • path β€” УказываСтся ΠΏΡƒΡ‚ΡŒ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ LXD смонтируСт это устройство
  • source β€” УказываСтся источник, ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ Π½Π° хостС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΆΠ΅Π»Π°Π΅Ρ‚Π΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ с ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ. Π£ΠΊΠ°ΠΆΠΈΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ согласно вашим прСдпочтСниям
lxc config device add jupyterlab hostfs disk path=/mnt/hostfs source=/home/dv/projects/ipython-notebooks

Для ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° /home/dv/projects/ipython-notebooks Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ установлСно Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π½ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сСйчас ΠΈΠΌΠ΅Π΅Ρ‚ UID Ρ€Π°Π²Π½Ρ‹ΠΉ SubUID + UID, смотритС Π³Π»Π°Π²Ρƒ Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ. ΠŸΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ возмоТности LXD β€” систСмы ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Π² Linux.

УстанавливаСм Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° хостС, Π³Π΄Π΅ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ jupyter, Π° пСрСмСнная $USER ΡƒΠΊΠ°ΠΆΠ΅Ρ‚ вашСго хостового ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² качСствС Π³Ρ€ΡƒΠΏΠΏΡ‹:

sudo chown 1001000:$USER /home/dv/projects/ipython-notebooks

Hello, World! ^

Если Ρƒ вас Π΅Ρ‰Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Π° консольная сСссия Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ с JupyterLab, Ρ‚ΠΎ пСрСзапуститС Π΅Ρ‘ с Π½ΠΎΠ²Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ --notebook-dir Π·Π°Π΄Π°Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ /mnt/hostfs Π² качСствС ΠΏΡƒΡ‚ΠΈ Π΄ΠΎ корня Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠΎΠ² Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ для устройства ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ создали Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ шагС:

jupyter lab --ip=0.0.0.0 --no-browser --notebook-dir=/mnt/hostfs

Π—Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° страницу http://10.0.5.5:8888 ΠΈ создайтС ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ваш Π½ΠΎΡƒΡ‚Π±ΡƒΠΊ Π½Π°ΠΆΠ°Π² ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½Π° страницС ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ Π½ΠΈΠΆΠ΅:

ЗапускаСм Jupyter Π½Π° ΠΎΡ€Π±ΠΈΡ‚Ρƒ LXD

Π—Π°Ρ‚Π΅ΠΌ Π² ΠΏΠΎΠ»Π΅ Π½Π° страницС Π²Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΊΠΎΠ΄ Π½Π° языкС Python ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ классичСский Hello World!. По ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Π²Π²ΠΎΠ΄Π° Π½Π°ΠΆΠΌΠΈΡ‚Π΅ CTRL+ENTER ΠΈΠ»ΠΈ ΠΊΠ½ΠΎΠΏΠΊΡƒ «play» Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ инструмСнтов свСрху Ρ‡Ρ‚ΠΎΠ±Ρ‹ JupyterLab Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» это:

ЗапускаСм Jupyter Π½Π° ΠΎΡ€Π±ΠΈΡ‚Ρƒ LXD

На этом ΠΏΠΎΡ‡Ρ‚ΠΈ всё Π³ΠΎΡ‚ΠΎΠ²ΠΎ ΠΊ использованию, Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ нСинтСрСсно, Ссли ΠΌΡ‹ Π½Π΅ установим Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Python-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ (ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹Π΅ прилоТСния) ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ стандартныС возмоТности Python Π² JupyterLab, поэтому, двигаСмся дальшС πŸ™‚

P.S. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ старая рСализация Jupyter ΠΏΠΎΠ΄ ΠΊΠΎΠ΄ΠΎΠ²Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ Jupyter Notebook Π½ΠΈΠΊΡƒΠ΄Π° Π½Π΅ дСлась ΠΈ ΠΎΠ½Π° сущСствуСт ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ с JupyterLab. Для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΊ старой вСрсии ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ ссылкС Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π² адрСсС суффикс/tree, Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ Π½ΠΎΠ²ΠΎΠΉ вСрсии осущСствляСтся с суффиксом /lab, Π½ΠΎ Π΅Π³ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ:

Π Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌ возмоТности Python ^

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ установим Ρ‚Π°ΠΊΠΈΠ΅ ΠΌΠΎΡ‰Π½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ языка Python ΠΊΠ°ΠΊ NumPy, Pandas, Matplotlib, IPyWidgets Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠΈ JupyterLab.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ пСрСчислСнныС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Python Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ pip ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ систСмныС зависимости Π² Alpine Linux:

  • g++ β€” НуТСн для компиляции ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π½Π° языкС C++ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΊ Python Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅ ΠΊΠ°ΠΊ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ
  • freetype-dev β€” Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ для Python модуля Matplotlib

УстанавливаСм зависимости:

lxc exec jupyterlab -- apk add g++ freetype-dev

Π•ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ состоянии дистрибутива Alpine Linux ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ NumPy Π½Π΅ получится, Π²Ρ‹Π»Π΅Ρ‚ΠΈΡ‚ ошибка компиляции ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠ½Π΅ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ:

ERROR: Could not build wheels for numpy which use PEP 517 and cannot be installed directly

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, этот ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΌΡ‹ установим ΠΊΠ°ΠΊ систСмный ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ распространяСт ΡƒΠΆΠ΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ, Π½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ старСС, Ρ‡Π΅ΠΌ доступна сСйчас Π½Π° сайтС:

lxc exec jupyterlab -- apk add py3-numpy py3-numpy-dev

Π”Π°Π»Π΅Π΅ устанавливаСм Python-ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ pip. ΠΠ°Π±Π΅Ρ€ΠΈΡ‚Π΅ΡΡŒ тСрпСния, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ это Π·Π°ΠΉΠΌΠ΅Ρ‚ нСсколько ΠΌΠΈΠ½ΡƒΡ‚. На ΠΌΠΎΠ΅ΠΉ машинС компиляция заняла ~15 ΠΌΠΈΠ½ΡƒΡ‚:

lxc exec jupyterlab -- python3 -m pip install pandas ipywidgets matplotlib

Чистим кСши установок:

lxc exec jupyterlab -- rm -rf /home/*/.cache/pip/*
lxc exec jupyterlab -- rm -rf /root/.cache/pip/*

ВСстируСм ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π² JupyterLab ^

Если Ρƒ вас Π·Π°ΠΏΡƒΡ‰Π΅Π½ JupyterLab, пСрСзапуститС Π΅Π³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ установлСнныС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ. Для этого Π² консольной сСссии Π½Π°ΠΆΠΌΠΈΡ‚Π΅ CTRL+C Ρ‚Π°ΠΌ Π³Π΄Π΅ ΠΎΠ½ Ρƒ вас Π·Π°ΠΏΡƒΡ‰Π΅Π½ ΠΈ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ y Π½Π° запрос остановки, Π° Π·Π°Ρ‚Π΅ΠΌ запуститС Π·Π°Π½ΠΎΠ²ΠΎ JupyterLab Π½Π°ΠΆΠ°Π² стрСлочку Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ «Π²Π²Π΅Ρ€Ρ…», Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π·Π°Π½ΠΎΠ²ΠΎ ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ Enter Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ:

jupyter lab --ip=0.0.0.0 --no-browser --notebook-dir=/mnt/hostfs

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π½Π° страницу http://10.0.5.5:8888/lab ΠΈΠ»ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ страницу, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Π²Π΅Π΄ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π² Π½ΠΎΠ²ΠΎΠΉ ячСйкС Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠ°:

%matplotlib inline

from ipywidgets import interactive
import matplotlib.pyplot as plt
import numpy as np

def f(m, b):
    plt.figure(2)
    x = np.linspace(-10, 10, num=1000)
    plt.plot(x, m * x + b)
    plt.ylim(-5, 5)
    plt.show()

interactive_plot = interactive(f, m=(-2.0, 2.0), b=(-3, 3, 0.5))
output = interactive_plot.children[-1]
output.layout.height = '350px'
interactive_plot

Π£ вас Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠ°ΠΊ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ Π½ΠΈΠΆΠ΅, Π³Π΄Π΅ IPyWidgets Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ UI-элСмСнт Π½Π° страницС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ взаимодСйствуСт с исходным ΠΊΠΎΠ΄ΠΎΠΌ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Matplotlib Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠΎΠ΄Π° Π² Π²ΠΈΠ΄Π΅ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ ΠΊΠ°ΠΊ Π³Ρ€Π°Ρ„ΠΈΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

ЗапускаСм Jupyter Π½Π° ΠΎΡ€Π±ΠΈΡ‚Ρƒ LXD

МногиС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ IPyWidgets Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π² Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π»Π°Ρ… здСсь

Π§Ρ‚ΠΎ Π΅Ρ‰Ρ‘? ^

Π’Ρ‹ ΠΌΠΎΠ»ΠΎΠ΄Ρ†Ρ‹, Ссли ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ ΠΈ дошли Π΄ΠΎ самого ΠΊΠΎΠ½Ρ†Π° ΡΡ‚Π°Ρ‚ΡŒΠΈ. Π― ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π½Π΅ стал Π²Ρ‹ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ скрипт Π² ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹ установил JupyterLab Π² «ΠΎΠ΄ΠΈΠ½ ΠΊΠ»ΠΈΠΊ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΎΡ‰Ρ€ΠΈΡ‚ΡŒ Ρ‚Ρ€ΡƒΠΆΠ΅Π½Π½ΠΈΠΊΠΎΠ² πŸ™‚ Но Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅ ΠΊΠ°ΠΊ, собрав ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² Π΅Π΄ΠΈΠ½Ρ‹ΠΉ Bash скрипт πŸ™‚

Π’Π°ΠΊΠΆΠ΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅:

  • Π—Π°Π΄Π°Ρ‚ΡŒ сСтСвоС имя для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° вмСсто IP адрСса прописав Π΅Π³ΠΎ Π² простом /etc/hosts ΠΈ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ Π½Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ адрСс http://jupyter.local:8888
  • ΠŸΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒΡΡ с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ рСсурсов для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, для этого ΠΏΡ€ΠΎΡ‡Ρ‚ΠΈΡ‚Π΅ Π³Π»Π°Π²Ρƒ Π² Π±Π°Π·ΠΎΠ²Ρ‹Ρ… возмоТностях LXD ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ большС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π½Π° сайтС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° LXD.
  • ΠŸΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚Π΅ΠΌΡƒ оформлСния:

ЗапускаСм Jupyter Π½Π° ΠΎΡ€Π±ΠΈΡ‚Ρƒ LXD

И ΠΌΠ½ΠΎΠ³ΠΎ Ρ‡Π΅Π³ΠΎ Π΅Ρ‰Ρ‘ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅! На этом всё. Π–Π΅Π»Π°ΡŽ Π²Π°ΠΌ успСхов!

UPDATE: 15.04.2020 18:30 β€” Π˜ΡΠΏΡ€Π°Π²ΠΈΠ» ошибки Π² Π³Π»Π°Π²Π΅ «Hello, World!»
UPDATE: 16.04.2020 10:00 β€” Π‘ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π» ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ» тСкст Π² описании Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ JupyterLab
UPDATE: 16.04.2020 10:40 β€” Π˜ΡΠΏΡ€Π°Π²ΠΈΠ» Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ ошибки Π² тСкстС ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» ΠΊ Π»ΡƒΡ‡ΡˆΠ΅ΠΌΡƒ Π³Π»Π°Π²Ρƒ «Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ софта ΠΈ настройка систСмы»

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ