docker-compose解决容器依赖问题

深碍√TFBOYSˉ_ 2022-09-11 01:25 390阅读 0赞

背景

做了个简单的程序,需要依赖mysql、redis、nginx等组件。

后续可能需要发布到其他地方做一下简单的展示,一想到要在一台新电脑上装jdk、mysql这些杂七杂八的环境就头疼,于是想试试docker来打包。

因为仅是展示,数据不太重要,所以打算用docker-compose来启动包括数据库在内的环境并且进行服务编排。

问题

项目需要依赖mysql,一开始以为在docker-compose.yml中配置depends_on属性就可以了,毕竟字面意思就是依赖于其他容器。但是编写完后启动项目报错,连接不上数据库。

经过一番测试才发现depends_on属性,只是让mysql比程序先启动,而非等mysql完全启动好了再启动程序。

虽然mysql先启动了,但因为初始化比较慢,程序启动较快,就出现了程序启动好而mysql还没启动完成的尴尬场面,所以程序连不上数据库。

解决方案

问题既然是因为程序比mysql先启动,那就让程序停下来等待mysql启动完成再执行就好啦,找了一下发现了个脚本,可以用来解决这个问题。

Github:wait-for-it

这个脚本会循环检测指定的主机端口是否准备完成,所以只需要在启动程序前去不断检测mysql的状态即可。
脚本用法:

  1. wait-for-it.sh host:port [-s] [-t timeout] [-- command args]
  2. -h HOST | --host=HOST Host or IP under test
  3. -p PORT | --port=PORT TCP port under test
  4. Alternatively, you specify the host and port as host:port
  5. -s | --strict Only execute subcommand if the test succeeds
  6. -q | --quiet Don't output any status messages
  7. -t TIMEOUT | --timeout=TIMEOUT
  8. Timeout in seconds, zero for no timeout
  9. -- COMMAND ARGS Execute command with args after the test finishes

将脚本放到Dockerfile同目录下,Dockerfile改为如下:

  1. # 从JDK8启动容器
  2. FROM java:8
  3. # 设置工作目录
  4. WORKDIR /usr/local/server/java
  5. # 复制jar包到容器内
  6. COPY *.jar /usr/local/server/java/app.jar
  7. COPY wait-for-it.sh /usr/local/server/java/wait-for-it.sh
  8. EXPOSE 8080 9090
  9. CMD mkdir html
  10. RUN chmod +x /usr/local/server/java/wait-for-it.sh
  11. ENTRYPOINT ["/usr/local/server/java/wait-for-it.sh", "mysql:3306", "--", "java", "-jar", "/usr/local/server/java/app.jar"]

由于docker-compose会帮我们生成一个网络,所以直接用mysql:3306即可连接到mysql。
最后的docker-compose.yml文件放一下:

  1. version: "3.9"
  2. services:
  3. java:
  4. build: .
  5. image: java:0.1
  6. ports:
  7. - 8080:8080
  8. depends_on:
  9. - mysql
  10. - redis
  11. mysql:
  12. image: mysql:5.7
  13. restart: always
  14. ports:
  15. - 3306:3306
  16. environment:
  17. MYSQL_ROOT_PASSWORD: 123456
  18. MYSQL_DATABASE: java
  19. volumes:
  20. - ./sql-init/:/docker-entrypoint-initdb.d/
  21. redis:
  22. image: redis:6.2.5
  23. restart: always
  24. ports:
  25. - 6379:6379
  26. nginx:
  27. image: nginx:1.21.1
  28. restart: always
  29. ports:
  30. - 80:80
  31. volumes:
  32. - ./html:/usr/share/nginx/html

发表评论

表情:
评论列表 (有 0 条评论,390人围观)

还没有评论,来说两句吧...

相关阅读