Healthcheck a depends_on v docker-compose

depends_on pouze zajistí, že kontejner, na který je depends_on, nastartuje jako první. Nezajišťuje ale, že daná servisa je připravená. K tomu je potřeba nastavit healthcheck. Jako příklad ukážu elasticsearch a logstash, kdy logstah čeká na elasticsearch.

elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2
    container_name: elasticsearch
    healthcheck:
      test: [ "CMD-SHELL", "curl -s http://localhost:9200 | grep -q 'You Know, for Search'" ]
      interval: 10s
      retries: 5
      start_period: 20s
      timeout: 5s

logstash:
    image: docker.elastic.co/logstash/logstash:8.10.2
    container_name: logstash
    depends_on:
      elasticsearch:
        condition: service_healthy
  • service_healthy znamená, že v tomto případě elasticsearch je healthy (zdravý) a podmínky tohoto „zdraví“ jsou definovány v části healthcheck.
  • CMD-SHELL umožňuje spustit příkazy v kontejneru
  • curl -s http://localhost:9200 získá odpověď z dané url. Pokud servisa neodpovídá, dostává: Failed to connect to localhost port 9200 after 0 ms: Connection refused
  • grep -q 'You Know, for Search' v odpovědi získané curlem se snaží získat řetězec 'You Know, for Search', který se vrací v případě, že elasticsearch odpovídá. Pokud tento řetězec nezíská, tak po několika pokusech (retries) docker-compose skončí hláškou: dependency failed to start: container elasticsearch is unhealthy

Zdroj: https://docs.docker.com/compose/how-tos/startup-order/

Grepování v docker lozích

Pomocí příkazu docker logs nazev_kontejneru je možné zobrazit logy. K jejich grepování (vyhledávání pomocí grep) je ale potřeba použít příkaz docker logs nazev_kontejneru 2>&1 | grep hledaný výraz. Je to proto, že kontejner loguje do stderr a roura (pipe) funguje pouze pro stdout.

1 znamená standardní výstup
2 znamená error výstup
2>&1 říká, že se má poslat error výstup na standardní výstup

Zdroje:

ssh a ssh-keygen

ssh-keygen
Generuje a spravuje authentikační klíče. Může vytvořit klíče pro použití SSH protokolu. Typ klíče se určuje přepínažem -t. Pokud použit bez argumentu, vygeneruje RSA klíč.

-E určí algoritmus pro jaký chceme zobrazit key fingerprint
-C přidá komentář
-l zobrazí fingerprint pro určitý veřejný klíč
-f adresa ke klíči

ssh-keygen -t ed25519 -C "comment"
ssh-keygen -E sha256 -lf key.put
ssh-keygen -E md5 -lf key.put

ssh
Program (klient) pro zalogování ke vzdálenému počítači. Je vytvořen za účelem bezpečné kryptované komunikace mezi dvěma počítači skrz nezabezpečenou síť.

-v verbose mode (dobrý pro debugging)
-T nepožaduje terminál (https://stackoverflow.com/questions/17900760/what-is-pseudo-tty-allocation-ssh-and-github)

ssh -vT git@gitlab.com

Poznámky:

Pokud nefunguje připojení (např. ke gitlabu), může to být způsobeno tím, že daný projekt nemá povoleno ssh (nechtějí mít otevřen port 22).

Nastavení více klíčů pro více účtů na gitlabu:

  • https://stackoverflow.com/questions/53494350/how-can-i-connect-to-gitlab-with-two-different-ssh-users
  • https://fusion-reactor.com/blog/evangelism/setting-up-multiple-ssh-keys-with-gitlab/
  • https://stackoverflow.com/questions/71098133/multiple-ssh-key-for-the-same-gitlab-host

MySQL v Dockeru

Chcete si vyzkoušel MySQL, ale nechcete ji instalovat do počítače. Použijte docker. Zde je příklad pro použití docker-compose.

docker-compose.yml

version: "3"

services:
  mysql:
    image: mysql:latest
    container_name: mysql
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - 3306:3306
    
volumes:
  db_data:

Následně stačí zadat příkaz docker-compose up.

Číst dál

Update prohlížeče Brave na Linux Mint

Postup je podobný instalaci, která je popsána na oficiálních stránkách.

sudo apt install curl

sudo curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg] https://brave-browser-apt-release.s3.brave.com/ stable main"|sudo tee /etc/apt/sources.list.d/brave-browser-release.list

sudo apt update

Rozdíl je v poslením kroku, kdy se zadá:

sudo apt install --only-upgrade brave-browser

Ve výpisu v konzoli je pak možné vidět následující:

Preparing to unpack .../brave-browser_1.56.20_amd64.deb ...
Unpacking brave-browser (1.56.20) over (1.30.86) ...
Setting up brave-browser (1.56.20) ...

Smazání všech lokálních Git větví

Příkaz git branch zobrazí seznam všech lokálních větví.

Příkaz git branch -r zobrazí seznam všech remote (vzdálených) větví

Příkaz git brach -d nazev_vetve smaže uvedenou lokální větev (pokud již byla mergnutá)

Příkaz git branch -D nazev_vetve smaže uvedenou lokální větev (bez ohledu na její merge status, je to zkratka pro --delete --force)

Smazání všech větví s výjimkou větve s názvem dev se provede příkazem

git branch | grep -v "dev" | xargs git branch -d

Anotace javax.persistence.SequenceGenerator

Anotace @SequenceGenerator se používá k určení generátoru primárních klíčů pro tabulku. Na tento generátor je odkazováno z anotace @GeneratedValue.

name – Název generátoru, který musí být unikátní.
sequenceName – Název sekvence v databázi. Je to sekvence, která již v databázi existuje.
allocationSize – Musí být stejná jako hodnota „auto incerement“ sekvence v databázi.

import cz.vitfo.entity.CustomerEntity.Companion.GENERATOR_NAME
import cz.vitfo.entity.CustomerEntity.Companion.SEQUENCE_NAME
import cz.vitfo.entity.CustomerEntity.Companion.TABLE_NAME
import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id
import javax.persistence.SequenceGenerator
import javax.persistence.Table

@Entity
@Table(name = TABLE_NAME)
@SequenceGenerator(name = GENERATOR_NAME, sequenceName = SEQUENCE_NAME, allocationSize = 1)
class CustomerEntity(

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = GENERATOR_NAME)
    var id: Long

) {
    companion object {
        const val TABLE_NAME = "t_customer"
        const val SEQUENCE_NAME = "${TABLE_NAME}_id_seq"
        const val GENERATOR_NAME = "${SEQUENCE_NAME}_gen"
    }
}

Root oprávnění v docker kontejneru

Docker nabízí příkaz exec, který spustí zadaný příkaz v běžícím kontejneru. Pokud tedy máme kontejner s názvem postgres, který obsahuje PostgreSQL databázi, pak příkazem docker exec -it postgres psql -U postgres spustíme v kontejneru postgres příkaz psql s paramatrem -U (uživatelské jméno) postgres. Tím se přihlásíme k databázi běžící v kontejneru.

Někdy můžeme chtít v kontejneru vykonávat nějakou činnost (např. vytvářet složky), k čemuž ale občas potřebujeme root oprávnění. Takto se vytvoříme složku realms v kontejneru s názvem keycloak. Do kontejneru se přihlásíme jako root: docker exec -u 0 keycloak bash -c "mkdir realms"