docker RUN / CMD возможно не выполняется - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь создать файл docker, в котором я сначала загружаю и устанавливаю Cloud SQL Proxy, перед запуском nodejs.

FROM node:13
WORKDIR /usr/src/app
RUN wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
RUN chmod +x cloud_sql_proxy
COPY . .
RUN npm install
EXPOSE 8000
RUN cloud_sql_proxy -instances=[project-id]:[region]:[instance-id]=tcp:5432 -credential_file=serviceaccount.json &
CMD node index.js

При создании файла docker Я не получаю никаких ошибок. Кроме того, файл serviceaccount. json включен и найден.

При запуске файла docker и проверке журналов я вижу, что соединение в моем приложении nodejs отклонено. Так что должна быть проблема с прокси Cloud SQL. Кроме того, я не вижу никакого вывода облачного SQL прокси в журналах, только из приложения nodejs. Когда я создаю виртуальную машину и устанавливаю оба пакета отдельно, это работает. Я получаю вывод типа «готов к подключению».

Так что мой файл docker почему-то неверен, потому что прокси-сервер Cloud SQL не установлен или не работает. Чего мне не хватает?

Редактировать:

У меня все получилось, но я не уверен, что это правильный способ сделать.

Теперь это мой dockerfile:

FROM node:13
WORKDIR /usr/src/app
COPY . .
RUN chmod +x wrapper.sh
RUN wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
RUN chmod +x cloud_sql_proxy
RUN npm install
EXPOSE 8000
CMD  ./wrapper.sh

А это мой упаковщик. sh file:

#!/bin/bash
set -m
./cloud_sql_proxy -instances=phosphor-dev-265913:us-central1:dev-sql=tcp:5432 -credential_file=serviceaccount.json &
sleep 5
node index.js
fg %1

Когда я удаляю "sleep 5", он не работает, потому что сервер уже работает до того, как будет установлено соединение cloud_sql_proxy. Со сном 5 он работает.

Есть ли другой / лучший способ подождать, пока первая команда не будет полностью выполнена?

1 Ответ

1 голос
/ 22 января 2020
Команды

RUN используются для того, чтобы что-то изменить в файловой системе образа, например, для установки пакетов и т. Д. c. Он не предназначен для запуска процесса, когда вы запускаете контейнер из получающегося изображения, как вы пытаетесь это сделать. Dockerfile используется только для создания образа контейнера stati c. Когда вы запускаете этот образ, внутри контейнера выполняются только те аргументы, которые вы указываете инструкции CMD (node index.js).

Если вам нужно запустить оба параметра cloud_sql_proxy и node внутри контейнера, поместите их в скрипт оболочки и запустите этот скрипт как часть инструкции CMD.

См. Запуск нескольких служб в контейнере


В идеале у вас должен быть отдельный контейнер для процесса. Я не уверен, что делает cloud_sql_proxy, но, вероятно, вы можете запустить его в своем собственном контейнере и запустить процесс node в своем собственном контейнере и связать их, используя docker network, если это необходимо.

Вы можете использовать docker-compose для управления, запуска и остановки этих нескольких контейнеров с помощью одной команды. docker -compose также обеспечивает автоматическую настройку сети между контейнерами. Вы также можете объявить, что ваше приложение node зависит от контейнера cloud_sql_proxy, так что docker -compose сначала запускает контейнер cloud_sql_proxy, а затем запускает приложение node.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...