J'essaie d'utiliser une image Percona Docker pour MongoDB sur GCE, mais je rencontre un problème avec Mongo qui dit que le chemin monté est en lecture seule. J'ai regardé autour de moi autant que j'ai pu, mais je ne sais pas quel pourrait être le problème.

gcloud compute instances create-with-container mongo-svr \
--create-disk name=disk-1,size=1GB \
--container-mount-disk mount-path="/data/mongodb",mode=rw \
--container-image=docker.io/percona/percona-server-mongodb:4.2

J'ai utilisé la commande ci-dessus et cela crée mon instance. Je me connecte ensuite en SSH au serveur, je me connecte à l'instance mongo en cours d'exécution pour l'arrêter, puis je lance : docker exec -it [NAME] mongod --configsvr --replSet rs0 --dbpath=/data/mongodb --bind_ip localhost

Cela crache une erreur indiquant :

CONTROL  [initandlisten] options: { net: { bindIp: "localhost" }, replication: { replSet: "rs0" }, sharding: { clusterRole: "configsvr" }, storage: { dbPath: "/data/mongodb" } }
STORAGE  [initandlisten] exception in initAndListen: IllegalOperation: Attempted to create a lock file on a read-only directory: /data/mongodb, terminating

À ce stade, j'ai recréé des instances avec différents paramètres, mais rien n'a fonctionné jusqu'à présent. Quelqu'un a une idée de ce qui me manque ?

Mise à jour avec la sortie de la commande

gcloud compute instances create-with-container mongo-config-f --zone us-central1-f --create-disk name=disk-1,size=1GB --container-mount-disk mount-path="/data/mongodb" --container-image=docker.io/percona/percona-server-mongodb:4.2 --machine-type=f1-micro
WARNING: Default device-name for disk name [disk-1] will be [disk-1] because it is being mounted to a container with [`--container-mount-disk`]
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_NAME]/zones/us-central1-f/instances/mongo-config-f].
NAME            ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
mongo-config-f  us-central1-f  f1-micro                   xx.xx.xx.xx  xx.xx.xx.xx     RUNNING
0
Mr_Antivius 19 févr. 2020 à 12:23

1 réponse

Meilleure réponse

J'ai essayé de reproduire votre problème sur mon projet de test et j'ai trouvé que :

  • le disque persistant a été créé et monté en mode lecture-écriture comme prévu ;

    bash-4.2$ mount 
    ...
    /dev/sdb on /data/mongodb type ext4 (rw,relatime)
    
  • docker exécute correctement les conteneurs à l'intérieur de notre VM ;

  • la cause de l'erreur lors de l'exécution de docker exec -it [NAME] mongod --configsvr --replSet rs0 --dbpath=/data/mongodb --bind_ip localhost est les autorisations dans le conteneur mongodb :

    bash-4.2$ ls -l /data/        
    ...
    drwxr-xr-x 3 root    root 4096 Feb 19 15:33 mongodb
    

Comme solution de contournement, les commandes peuvent être exécutées avec les autorisations root :

$ docker exec -it --user root klt-mongo-svr-upd-wowt mongod --configsvr --replSet rs0 --db path=/data/mongodb

Veuillez trouver plus de détails et mes étapes ci-dessous:

  1. créer une machine virtuelle :

    $ gcloud compute instances create-with-container mongo-svr \
    --create-disk name=disk-1,size=1GB \                                                                                 
    --container-image docker.io/percona/percona-server-mongodb:4.2 \
    --container-mount-disk mount-path="/data/mongodb"                               
    WARNING: Default device-name for disk name [disk-1] will be [disk-1] because it is being mounted to a container with [`--container-mount-disk`]
    Created [https://www.googleapis.com/compute/v1/projects/test-prj/zones/europe-west3-a/instances/mongo-svr].
    NAME           ZONE            MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP     STATUS
    mongo-svr-upd  europe-west3-a  n1-standard-1               10.156.0.9   35.XXX.155.XXX  RUNNING
    
  2. SSH vers l'instance ;

  3. vérifier si le conteneur est en cours d'exécution :

    $ docker ps
    CONTAINER ID        IMAGE                                                                COMMAND                  CREATED              STATUS              PORTS               NAMES
    dfad9c10235d        percona/percona-server-mongodb:4.2                                   "/entrypoint.sh mong…"   About a minute ago   Up About a minute                       klt-mongo-svr-upd-wowt
    bbe02c8e8621        gcr.io/stackdriver-agents/stackdriver-logging-agent:0.2-1.5.33-1-1   "/entrypoint.sh /usr…"   About a minute ago   Up About a minute                       stackdriver-logging-agent
    

    tout semble bon à ce stade ;

  4. essayez d'exécuter la commande en tant qu'utilisateur :

     $ docker exec -it klt-mongo-svr-upd-wowt mongod --configsvr --replSet rs0 --dbpath=/data/mongodb --bind_ip localhost
    

    et observez la même erreur :

    2020-02-19T15:37:53.176+0000 I  STORAGE  [initandlisten] exception in initAndListen: IllegalOperation: Attempted to create a lock file on a read-only directory: /data/mongodb, terminating
    

    ici la clé répertoire en lecture seule : /data/mongodb ;

  5. vérifiez les montages et les autorisations à l'intérieur du conteneur :

    $ docker exec -it klt-mongo-svr-upd-wowt /bin/bash
    bash-4.2$ mount 
    ...
    /dev/sdb on /data/mongodb type ext4 (rw,relatime)
    ...
    

    comme prévu, le disque a été créé et monté en mode lecture-écriture dans le conteneur

    bash-4.2$ ls -l /data/        
    total 8
    drwxr-xr-x 4 mongodb root 4096 Feb 19 15:36 db
    drwxr-xr-x 3 root    root 4096 Feb 19 15:33 mongodb
    bash-4.2$ 
    

    mais pour travailler avec /data/mongodb, vous avez besoin des autorisations root ;

  6. essayez d'exécuter la commande en tant que root :

    $ docker exec -it --user root klt-mongo-svr-upd-wowt mongod --configsvr --replSet rs0 --dbpath=/data/mongodb
    2020-02-19T15:45:24.970+0000 I  CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
    2020-02-19T15:45:24.973+0000 I  CONTROL  [initandlisten] MongoDB starting : pid=119 port=27019 dbpath=/data/mongodb 64-bit host=mongo-svr-upd
    2020-02-19T15:45:24.974+0000 I  CONTROL  [initandlisten] db version v4.2.2-3
    2020-02-19T15:45:24.974+0000 I  CONTROL  [initandlisten] git version: 2cdb6e50913583f627acc5de35dc4e04dbfe196f
    2020-02-19T15:45:24.974+0000 I  CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.2k-fips  26 Jan 2017
    2020-02-19T15:45:24.974+0000 I  CONTROL  [initandlisten] allocator: tcmalloc
    2020-02-19T15:45:24.974+0000 I  CONTROL  [initandlisten] modules: none
    2020-02-19T15:45:24.974+0000 I  CONTROL  [initandlisten] build environment:
    2020-02-19T15:45:24.975+0000 I  CONTROL  [initandlisten]     distarch: x86_64
    2020-02-19T15:45:24.975+0000 I  CONTROL  [initandlisten]     target_arch: x86_64
    2020-02-19T15:45:24.975+0000 I  CONTROL  [initandlisten] options: { replication: { replSet: "rs0" }, sharding: { clusterRole: "configsvr" }, storage: { dbPath: "/data/mongodb" } }
    2020-02-19T15:45:24.976+0000 I  STORAGE  [initandlisten] Detected data files in /data/mongodb created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.
    ...
    

    et il fonctionne avec les autorisations root.

1
Serhii Rohoza 19 févr. 2020 à 16:43