我在docker-compose.yml中有一个mysql-db和pyramida映像。我想让prisma等待数据库准备就绪,否则会导致prisma继续重启并且根本无法工作。而且我从here知道,我可以使用./wait-for-it,但搜索了一会儿之后就无法连接各个片段。
version: '3'
services:
prisma:
image: prismagraphql/prisma:1.25
restart: unless-stopped
ports:
- "4001:4466"
depends_on:
- db
# I added this command
command: ["./wait-for-it.sh", "db:33061", "--"]
environment:
PRISMA_CONFIG: |
managementApiSecret: server.secret.123
port: 4466
databases:
default:
connector: mysql
active: true
host: db
port: 3306
user: ***
password: ***
db:
image: mysql:5.7
restart: unless-stopped
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_USER: ***
MYSQL_ROOT_PASSWORD: ***
ports:
- "33061:3306"
volumes:
- /docker/mysql:/var/lib/mysql
我在上面添加了命令,但是没有任何变化,甚至没有日志中的错误,但是据我了解,该命令在容器内运行。
我只有docker-compose文件,想做docker-compose up -d
答案 0 :(得分:1)
您正在混淆内部和外部端口。数据库在网络内部的端口3306
上可见,因此您必须等待db:3306
而不是33061
。
端口暴露在docker-compose
默认创建的用户定义网桥网络内无效。默认情况下,所有端口对网络内部的容器都是可见的。公开端口后,您可以在外部网络中看到它。
还要确保图像ENTRYPOINT
的{{1}}是什么。如果不是prismagraphql/prisma:1.25
或其他类型的外壳,则您的/bin/sh -c
将不会执行。
如果您在command
中获得的基本图片与ENTRYPOINT
不同,则可以覆盖。假设您有/bin/sh -c
,则可以执行以下操作:
docker-compose.yml
/bin/sh -c /app/start.sh
答案 1 :(得分:0)
现在,我了解了如何将wait-for-it.sh
包含到容器中。
我将wait-for-it.sh下载到项目文件夹中,然后创建了一个名为 Dockerfile 的文件,其内容为:
FROM prismagraphql/prisma:1.25
COPY ./wait-for-it.sh /app/wait-for-it.sh
RUN chmod +x /app/wait-for-it.sh
ENTRYPOINT ["/bin/sh","-c","/app/wait-for-it.sh db:3306 -t 30 -- /app/start.sh"]
在我的docker-compose.yml中,我替换了
image: prismagraphql/prisma:1.25
与build: .
一起使用,这会导致我的项目路径中的Dockerfile产生新的构建。
现在,将根据棱镜图像构建新图像,并将wait-for-it.sh复制到新图像中。然后ENTRYPOINT会被覆盖,prisma将等待直到数据库准备就绪。