Docker compose - Невозможно подключиться к mysql - Сборки приложений раньше mysql? - PullRequest
0 голосов
/ 29 марта 2020

У меня есть docker compose file, запускающий 3 приложения. mysql, phpmyadmin & nodejs app. Вы найдете файл композиции ниже.

  1. Приложение nodejs имеет квитанцию ​​JS, которая требует запуска команды миграции и заполнения при инициализации.
  2. При запуске docker-compose up --build сборка завершается неудачно, поскольку mysql возвращает с ошибкой getaddrinfo ENOTFOUND mysql
  3. Я не могу понять, что я сделал не так в файле compose, так как он выглядит нормально для меня.

и phpmyadmin, и auth app требуется mysql, поэтому я добавил mysql в depends_on раздел. Из файла журнала видно, что composer пытается создать auth перед созданием mysql.

Журналы


Creating network "updials-auth_default" with the default driver
Building auth
Step 1/8 : FROM node:12.14.0
 ---> 6b5991bf650f
Step 2/8 : WORKDIR /var/www
 ---> Using cache
 ---> 21c89e8b8059
Step 3/8 : COPY . .
 ---> 73072a4bddb5
Step 4/8 : COPY package.json /usr/share/app
 ---> 886992b71802
Step 5/8 : EXPOSE 3001
 ---> Running in cd7c14183427
Removing intermediate container cd7c14183427
 ---> b93bcdf8c653
Step 6/8 : RUN npm install
 ---> Running in 4b6d75b77bab
npm WARN deprecated mkdirp@0.5.1: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN rm not removing /var/www/node_modules/.bin/rimraf as it wasn't installed by /var/www/node_modules/rimraf

> bcrypt@3.0.8 install /var/www/node_modules/bcrypt
> node-pre-gyp install --fallback-to-build

node-pre-gyp WARN Using request for node-pre-gyp https download 
[bcrypt] Success: "/var/www/node_modules/bcrypt/lib/binding/bcrypt_lib.node" is installed via remote

> ejs@2.7.4 postinstall /var/www/node_modules/ejs
> node ./postinstall.js

Thank you for installing EJS: built with the Jake JavaScript build tool (https://jakejs.com/)

npm notice created a lockfile as package-lock.json. You should commit this file.
added 18 packages from 3 contributors, removed 9 packages, updated 467 packages and audited 1563 packages in 51.173s

22 packages are looking for funding
  run `npm fund` for details

found 5 low severity vulnerabilities
  run `npm audit fix` to fix them, or `npm audit` for details
Removing intermediate container 4b6d75b77bab
 ---> f3c15392ccc2
Step 7/8 : RUN npm run migrate && npm run seed
 ---> Running in cd58f889c907

> updials-auth@0.0.2 migrate /var/www
> npx sequelize-cli db:migrate

npx: installed 81 in 8.76s

Sequelize CLI [Node: 12.14.0, CLI: 5.5.1, ORM: 5.21.5]

Loaded configuration file "config/config.js".
Using environment "development".

ERROR: getaddrinfo ENOTFOUND mysql

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! updials-auth@0.0.2 migrate: `npx sequelize-cli db:migrate`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the updials-auth@0.0.2 migrate script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2020-03-29T15_36_20_888Z-debug.log
ERROR: Service 'auth' failed to build: The command '/bin/sh -c npm run migrate && npm run seed' returned a non-zero code: 1

Dockerfile

FROM node:12.14.0
#USER node
WORKDIR /var/www

COPY . .
COPY package.json /usr/share/app
#COPY package.lock.json /usr/share/app

EXPOSE 3001
RUN npm install
RUN npm run migrate && npm run seed

CMD ["npm", "start"]

docker -compose.yml

version: '3.7'

services:
    mysql:
        container_name: updials-auth-mysql
        image: mysql:5.7
        environment: 
            MYSQL_ROOT_PASSWORD: 'password'
            MYSQL_DATABASE: 'updials'
            MYSQL_USER: 'updials'
            MYSQL_PASSWORD: 'password'
        volumes:
            - database:/var/lib/mysql

    auth:
        container_name: updials-auth
        restart: always
        depends_on: 
            - mysql
        build: .
        ports: 
            - '3001:5002'
        environment: 
            DB_HOST: 'mysql'
            DB_USER: 'updials'
            DB_PASS: 'password'
            DB_NAME: 'updials'
    phpmyadmin:
        container_name: phpmyadmin-updials-auth
        restart: always
        image: phpmyadmin/phpmyadmin:5.0.2
        depends_on: 
            - mysql
        environment: 
            MYSQL_USER: updials
            MYSQL_PASSWORD: password
        ports:
            - '4000:8080'
volumes: 
    database:
        driver: local
        driver_opts: 
            type: 'none'
            o: 'bind'
            device: '/home/sisir/docker-databases/updials-auth'

1 Ответ

2 голосов
/ 29 марта 2020

Dockerfile никогда не сможет получить доступ к базе данных, томам или другим ресурсам, объявленным в docker-compose.yml (за пределами непосредственного блока build: этой службы). Сборка проходит как отдельный этап; он не подключается к сети Compose.

(Представьте себе, что на одной системе запущено docker build; docker push, а на второй системе указано соответствующее значение image:. В этой настройке система времени сборки не может получить доступ к базе данных времени выполнения, и это базовая модель c, которую вы должны иметь в виду. Более конкретно, вы можете удалить и воссоздать свой контейнер mysql без перестройки своего auth образа.)

Типичная Чтобы сделать эту работу, нужно написать скрипт точки входа. Это становится основной командой вашего контейнера; он получает Dockerfile CMD (или Docker Compose command:) в качестве аргументов командной строки. Поскольку он запускается в момент запуска контейнера, он имеет доступ к базе данных, сетям, переменным среды, et c.

#!/bin/sh
set -e           # Stop on any error
npm run migrate  # Run migrations
npm run seed     # Preload initial data
exec "$@"        # Run the command as the main container process

В вашем Dockerfile поместите этот скрипт как ENTRYPOINT. Вы должны использовать JSON форму массива ENTRYPOINT здесь.

FROM node:12.14.0
WORKDIR /var/www

# Install dependencies first to save time on rebuild
COPY package.json .
RUN npm install

COPY . .
EXPOSE 3001

RUN chmod +x entrypoint.sh      # if required
ENTRYPOINT ["./entrypoint.sh"]
CMD ["npm", "start"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...