Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 546 razy

W trakcie uruchamiania kontenera można do jego wnętrza przekazać parametry sterujące np. ustawieniami dostępu do bazy danych poprzez podanie nazwy użytkownika i hasła. I znów odniosę się do dokumentacji mongodb.com/compatibility/docker, gdzie można przeczytać:

To initialize your MongoDB with a root user, you can use the environment variables MONGO_INITDB_ROOT_USERNAME and MONGO_INITDB_ROOT_PASSWORD. These environment variables will create a user with root permissions with the specified user name and password.
docker run --name mongodb -d -e MONGO_INITDB_ROOT_USERNAME=AzureDiamond -e MONGO_INITDB_ROOT_PASSWORD=hunter2 mongo

Jak nie trudno się domyślić opcja -e umożliwia ustawienie pojedynczej zmiennej środowiskowej w formacie:

NAZWA_ZMIENNEJ=Wartość

W przypadku opisanym powyżej można określić dane dostępowe do bazy danych wewnątrz kontenera bazy danych. Jak jednak użyć te parametry wewnątrz serwera? Odpowiedź wymaga zmodyfikowania kodu w następujący sposób:

const connection = `mongodb://${
  process.env.USER ? process.env.USER + ':' + process.env.PASSWORD + '@' : ''
}mongodb:27017/wisches?authSource=admin`;


mongoose.connect(
  connection,

W przypadku node dostępny jest obiekt globalny o nazwie process, który z kolei zawiera pole o nazwie env i to właśnie pole może zawierać kolejny obiekt z parametrami sterującymi.

Nie przynudzając już ani sekundy dłużej rozpocznijmy przebudowywanie obrazu serwera w tradycyjny ludowy sposób:

docker build -t node-api:1.0 .

Teraz uruchamiam instancję dla bazy danych:

docker run -d --network net-wishes --name mongodb --rm -v mongo-wishes:/data/db -e MONGO_INITDB_ROOT_USERNAME=AzureDiamond -e MONGO_INITDB_ROOT_PASSWORD=hunter2 mongo

by po chwili, lub co najwyżej dwóch oddać się szaleńczej rozkoszy uruchamiania serwera:

docker run -p 8889:8888 --name node -v "${pwd}:/app" --network net-wishes --rm -d -e USER=AzureDiamond -e PASSWORD=hunter2 node-api:1.0

Co sprytniejsze ludzie wolą sobie utworzyć skrypt .sh:

docker run -d --network net-wishes --name mongodb --rm -v mongo-wishes:/data/db -e MONGO_INITDB_ROOT_USERNAME=AzureDiamond -e MONGO_INITDB_ROOT_PASSWORD=hunter2 mongo docker run -p 8889:8888 --name node -v "${pwd}:/app" --network net-wishes --rm -d -e USER=AzureDiamond -e PASSWORD=hunter2 node-api:1.0

Po tej jakże nużącej czynności można się oddać niezmiernej przyjemności sprawdzenia np. Postman-em czy to w ogóle działa?!

I tu mała uwaga. Jeżeli uruchamiałeś instancję kontenera bazy danych MongoDb z opcją -v mongo-wishes:/data/db przed utworzeniem użytkownika, to niestety musisz się pożegnać z tym volume-nem. Dzieje się tak dlatego, że dane starej bazy danych są kopiowane i nadpisują ustawienia użytkownika. Jeżeli wywalisz ten volume-n wszystko zacznie działać ponownie.

Docker - mongodb  sprawdzanie, czy działa za pomocą Postmana
Rys. 1
Docker - MongoDb sprawdzanie, czy działa za pomocą Postman-a

Załączniki:

Przygotowany serwer i skrypty uruchomieniowe z wykorzystaniem parametrów do skonfigurowania połączenia z bazą danych