jam*_*123 10 mysql node.js docker
我正在构建一个使用 nodeJS 和后端以及 mySQL 作为后端的应用程序,目前,我启动应用程序(没有 docker)的步骤是:
npm install并npm start在端口 8080 上启动 NodeJS现在我想对我的应用程序进行 dokerize,并且我已经有了以下 Dockerfile:
#node version: carbon
#app version: 1.0.0
FROM node:8.11.2
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
Run Code Online (Sandbox Code Playgroud)
我在 ./docker_db 文件夹中放置了一个 init.sql 文件,它执行以下操作:
CREATE USER 'app_user'@'%' IDENTIFIED BY 'password';
CREATE SCHEMA `myapp` DEFAULT CHARACTER SET utf8;
GRANT INSERT, CREATE, ALTER, UPDATE, SELECT, REFERENCES on myapp.*
TO 'app_user'@'%' IDENTIFIED BY 'password'
WITH GRANT OPTION;
Run Code Online (Sandbox Code Playgroud)
以及以下 docker-compose.yaml:
version: '3.6'
services:
mysql1:
image: mysql/mysql-server:5.7
environment:
MYSQL_ROOT_PASSWORD: password
ports:
- "127.0.0.1:3306:3306"
volumes:
- type: bind
source: ./docker_db
target: /docker-entrypoint-initdb.d
expose:
- "3306"
networks:
- app-network
myapp:
build:
context: .
dockerfile: Dockerfile
command: npm start
depends_on:
- mysql1
ports:
- "127.0.0.1:8080:8080"
expose:
- "8080"
links:
- mysql1
networks:
- app-network
command: ["./wait-for-db.sh"]
networks:
app-network:
driver: bridge
Run Code Online (Sandbox Code Playgroud)
我的 ./wait-for-db.sh 执行以下操作:
#!/bin/bash
until mysql -h mysql1 -u app_user -p password -e 'select 1'; do
echo "still waiting for mysql"; sleep 1; done
exec node ./db/scripts/generateSequelizeCLIConfig.js
exec node_modules/sequelize-cli/bin/sequelize db:migrate
exec node_modules/sequelize-cli/bin/sequelize db:seed:all
exec npm start
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,我确实想将 3306 暴露给主机,以便我可以使用工作台连接到我已成功连接的 mysql 服务器。)
在我的续集配置文件中,我确实有:
"username": "app_user",
"password": "password",
"database": "myapp",
"host": "mysql1",
"port": "3306"
Run Code Online (Sandbox Code Playgroud)
通过上面的设置,我执行了docker-compose up,然后我得到了以下几行:
mysql1_1 | [Entrypoint] MySQL Docker Image 5.7.22-1.1.5
mysql1_1 | [Entrypoint] Initializing database
myapp_1 | standard_init_linux.go:190: exec user process caused "no such file or directory"
myapp_myapp_1 exited with code 1
mysql1_1 | [Entrypoint] Database initialized
mysql1_1 | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
mysql1_1 | Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
mysql1_1 | Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
mysql1_1 | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
mysql1_1 | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
mysql1_1 |
mysql1_1 | [Entrypoint] running /docker-entrypoint-initdb.d/init.sql
mysql1_1 |
mysql1_1 |
mysql1_1 | [Entrypoint] Server shut down
mysql1_1 |
mysql1_1 | [Entrypoint] MySQL init process done. Ready for start up.
mysql1_1 |
mysql1_1 | [Entrypoint] Starting MySQL 5.7.22-1.1.5
Run Code Online (Sandbox Code Playgroud)
我现在面临的问题是:
1) 脚本的执行挂在最后一行Starting MySQL 5.7.22-1.1.5而不去任何地方。
2) 在输出中,第 3 行和第 4 行显示有关 exec 用户进程导致“没有此类文件或目录”的错误。我不认为这是由 wait-for-db.sh 中的命令引起的,因为如果我删除until命令后的行,问题仍然存在。事实上,我怀疑命令执行是否会到达这些行,并且感觉它仍在until命令中。
不过,我认为它非常接近最终解决方案:)
使用 db 服务的名称mysql作为数据库主机。Docker 会将其解析为实际 IP。还有为什么你有FROM mysql:5.7你的Dockerfile,我认为它没有任何用处。
更新
好吧,似乎myapp在数据库准备好之前运行数据库脚本。在这里查看解决方案https://docs.docker.com/compose/startup-order/
| 归档时间: |
|
| 查看次数: |
14387 次 |
| 最近记录: |