使用docker-compose.yml中的命令等待Docker容器准备就绪

时间:2019-02-15 11:02:48

标签: docker docker-compose startup

我在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

我在上面添加了命令,但是没有任何变化,甚至没有日志中的错误,但是据我了解,该命令在容器内运行。

  1. 如何将./wait-for-it.sh放入容器?
  2. 并且这甚至可以通过命令以这种方式工作还是取决于 在棱镜图像上?
  3. 否则,我将如何实现等待?

我只有docker-compose文件,想做docker-compose up -d

2 个答案:

答案 0 :(得分:1)

您正在混淆内部和外部端口。数据库在网络内部的端口3306上可见,因此您必须等待db:3306而不是33061

端口暴露在docker-compose默认创建的用户定义网桥网络内无效。默认情况下,所有端口对网络内部的容器都是可见的。公开端口后,您可以在外部网络中看到它。

还要确保图像ENTRYPOINT的{​​{1}}是什么。如果不是prismagraphql/prisma:1.25或其他类型的外壳,则您的/bin/sh -c将不会执行。

UPD

如果您在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.25build: .一起使用,这会导致我的项目路径中的Dockerfile产生新的构建。

现在,将根据棱镜图像构建新图像,并将wait-for-it.sh复制到新图像中。然后ENTRYPOINT会被覆盖,prisma将等待直到数据库准备就绪。