Флаг GCE "create-with-container --container-mount-disk" монтирует диск как доступный только для чтения.
Я пытаюсь использовать образ Percona Docker для MongoDB на GCE, однако у меня возникает проблема с Mongo, говорящая, что смонтированный путь доступен только для чтения. Я огляделся, сколько смог, но не понял, в чем может быть проблема.
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
Я использовал указанную выше команду, и она создала мой экземпляр. Затем я подключаюсь к серверу по SSH, подключаюсь к работающему экземпляру mongo для выключения, затем запускаю:docker exec -it [NAME] mongod --configsvr --replSet rs0 --dbpath=/data/mongodb --bind_ip localhost
Это выдает сообщение об ошибке:
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
На данный момент я воссоздавал экземпляры с разными параметрами, но пока ничего не работало. У кого-нибудь есть идея, что мне не хватает?
Обновлено с выводом команды
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
1 ответ
Я попытался воспроизвести вашу проблему в своем тестовом проекте и обнаружил, что:
постоянный диск был создан и смонтирован в режиме чтения-записи, как и ожидалось;
bash-4.2$ mount ... /dev/sdb on /data/mongodb type ext4 (rw,relatime)
docker правильно запускает контейнеры внутри нашей виртуальной машины;
причина ошибки при работе
docker exec -it [NAME] mongod --configsvr --replSet rs0 --dbpath=/data/mongodb --bind_ip localhost
это разрешения внутри контейнера mongodb:bash-4.2$ ls -l /data/ ... drwxr-xr-x 3 root root 4096 Feb 19 15:33 mongodb
В качестве обходного пути команды могут быть выполнены с правами root:
$ docker exec -it --user root klt-mongo-svr-upd-wowt mongod --configsvr --replSet rs0 --db path=/data/mongodb
Пожалуйста, найдите более подробную информацию и мои шаги ниже:
создать ВМ:
$ 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
SSH к экземпляру;
проверьте, запущен ли контейнер:
$ 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
на данный момент все выглядит хорошо;
попробуйте запустить команду от имени пользователя:
$ docker exec -it klt-mongo-svr-upd-wowt mongod --configsvr --replSet rs0 --dbpath=/data/mongodb --bind_ip localhost
и наблюдаем ту же ошибку:
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
здесь ключевой каталог только для чтения: / data / mongodb;
проверьте монтирования и разрешения внутри контейнера:
$ docker exec -it klt-mongo-svr-upd-wowt /bin/bash bash-4.2$ mount ... /dev/sdb on /data/mongodb type ext4 (rw,relatime) ...
как мы и ожидали, диск был создан и смонтирован в режиме чтения-записи в контейнер
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$
но работать с
/data/mongodb
тебе нужноroot
разрешения;попробуйте запустить команду как 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'. ...
и он работает с правами root.