Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Usage with Docker #57

Open
agustisanchez opened this issue Mar 5, 2018 · 16 comments
Open

Usage with Docker #57

agustisanchez opened this issue Mar 5, 2018 · 16 comments

Comments

@agustisanchez
Copy link

In order to use it with Docker and docker-compose,
place it alongside Dockerfile, build it into the image with exec permissions and reference it in docker-compose.yml.

- Dockerfile
- wait-for-it.sh
#Dockerfile
...
COPY wait-for-it.sh /wait-for-it.sh
RUN chmod +x /wait-for-it.sh
...
#docker-compose.yml
...
  my-service:
    build:
      context: "."
      container_name: my_container
      command: ["/wait-for-it.sh", "mysql:3306", "--", [entrypoint function]]
...
@douglas-gibbons
Copy link
Collaborator

Thanks @agustisanchez - I like it. Depending on your setup, you might also copy wait-for-it.sh in as a mounted volume, such as this:

version: '3'

services:
  hello-world:
    image: ubuntu
    volumes:
      - ./wait-for-it.sh:/usr/local/bin/wait-for-it.sh
    command:
      - wait-for-it.sh
      - github.com:80
      - --
      - echo
      - "hello world"

@portolkyz
Copy link

portolkyz commented Jan 9, 2019

Depending on the base image used there will be no netcat available in the container. The description pure bash conflicts in this case with the fact that netcat is no shell builtin. No offense intended.

Cheers

@Tux1234
Copy link

Tux1234 commented Feb 12, 2019

Can you tell me what my Entrypoint is?
Given are the following snippets.

#Dockerfile

FROM java:8
VOLUME /tmp
EXPOSE 8080
COPY wait-for-mysql.sh /wait-for-mysql.sh
RUN chmod +x /wait-for-mysql.sh
ADD target/App.jar App.jar.
ENTRYPOINT ["java","-jar","App.jar"]

Im not shure with my ENTRYPOINT. I do the follwoing.
#docker-compose.yml

...
  mysql-docker-container:
  ..
  .
  my-service:
    build:
      context: "."
      container_name: my_container
      command: ["./wait-for-mysql.sh", "mysql-docker-container:3306", "--", "java", "App.jar"]
....

Is the Entrypoint correct?

@Calimerico
Copy link

I think that your command should look like this:
command: ["./wait-for-mysql.sh", "mysql-docker-container:3306", "--", "sh", "-c", "java", "App.jar"]

@alexgivi
Copy link

alexgivi commented May 20, 2019

to find out what is default entrypoint - do next steps:

  1. comment entrypoint config line in docker-compose.yml
  2. start service (docker-compose up -d)
  3. inspect service (docker inspect my_container) and find info about entrypoint. also it's possible to view entrypoint via docker ps, but string is truncated.
  4. modify your entrypoint: "wait-for-it mysql-docker-container:3306 -- default-entrypoint", replace "default-entrypoint" to your actual command

@yaoyuanyy
Copy link

In order to use it with Docker and docker-compose,
place it alongside Dockerfile, build it into the image with exec permissions and reference it in docker-compose.yml.

- Dockerfile
- wait-for-it.sh
#Dockerfile
...
COPY wait-for-it.sh /wait-for-it.sh
RUN chmod +x /wait-for-it.sh
...
#docker-compose.yml
...
  my-service:
    build:
      context: "."
      container_name: my_container
      command: ["/wait-for-it.sh", "mysql:3306", "--", [entrypoint function]]
...

@agustisanchez what is the "entrypoint function" in docker-compose.yml

@yaoyuanyy
Copy link

@agustisanchez if i want to run a java project, what is the "entrypoint function"

@alexgivi
Copy link

alexgivi commented May 26, 2019

https://docs.docker.com/compose/compose-file/#command
https://docs.docker.com/compose/compose-file/#entrypoint
there is some difference between command and entrypoint.
personally I prefer to use entrypoint config and don't use command.

@jakzal
Copy link

jakzal commented May 31, 2019

Multistage builds can be leveraged to install wait-for-it with apt-get:

FROM debian:buster-slim as wait-for-it
RUN apt-get update && apt-get install -y "wait-for-it"

FROM debian:buster-slim
COPY --from=wait-for-it /usr/bin/wait-for-it /usr/bin/wait-for-it

If there was an official docker image for wait-for-it (i.e. wait-for-it/wait-for-it) we could potentially do:

FROM debian:buster-slim
COPY --from=wait-for-it/wait-for-it /usr/bin/wait-for-it /usr/bin/wait-for-it

@kunal-bhatia
Copy link

kunal-bhatia commented Jun 12, 2019

@douglas-gibbons Is it possible to use it with google distroless java images?

@mdkalish
Copy link

For a dependency that you don't need to build (i.e. also create Dockerfile and specify context), you can make it work with the volumes config only:

  1. chmod 755 wait-for-it.sh
# docker-compose.yml
…
volumes:
  - "./wait-for-it.sh:/wait-for-it.sh:ro"
…

Good to know:

  • Bind mounts keep the host's permissions[source], so step 1) is obligatory.
  • The read-only (ro) segment is optional.

@ncjones
Copy link

ncjones commented Feb 5, 2020

wait-for-it.sh is not trapping SIGTERM so, to be able to gracefully stop a service that is stuck waiting, the stop signal needs to be overridden in docker-compose.yml:

version: '3'

services:
  wait-for-app:
    image: ubuntu
    volumes:
      - ./wait-for-it.sh:/usr/local/bin/wait-for-it.sh
    command: wait-for-it.sh app:8080 -- echo ok
    stop_signal: SIGINT

@97lynk
Copy link

97lynk commented May 12, 2020

I want to share my case. I investigated.

I using openjdk:8-jdk-alpine image docker.
My environment:

  • OS: window 10 Pro
  • Docker engine: 19.03.2

My Dockerfile

FROM openjdk:8-jdk-alpine

RUN apk add --no-cache bash

COPY ./wait-for-it.sh /wait-for-it.sh

RUN chmod +x wait-for-it.sh

RUN ls -la

and used it in docker-compose.yml file
command: bash ./wait-for-it.sh my-service:8080 --strict -- java -jar app.jar
But it was failed!!! @@

This issue is EOL(end of line). My wait_for_it.sh file has CRLF (windows). I changed it into LF (for Unix and MacOs). It worked!

@SandeepYadav-Hashedin
Copy link

I want to share my case. I investigated.

I using openjdk:8-jdk-alpine image docker.
My environment:

  • OS: window 10 Pro
  • Docker engine: 19.03.2

My Dockerfile

FROM openjdk:8-jdk-alpine

RUN apk add --no-cache bash

COPY ./wait-for-it.sh /wait-for-it.sh

RUN chmod +x wait-for-it.sh

RUN ls -la

and used it in docker-compose.yml file
command: bash ./wait-for-it.sh my-service:8080 --strict -- java -jar app.jar
But it was failed!!! @@

This issue is EOL(end of line). My wait_for_it.sh file has CRLF (windows). I changed it into LF (for Unix and MacOs). It worked!

Thanks, this really helped, I had spent hours figuring out why it's not working for me despite putting all the commands correctly. Changing from CRLF to LF worked like a charm.

@Choongkyu
Copy link

is there a way to retain the CMD in the Dockerfile so other users can easily opt-out of using docker-compose?

@johntheprime
Copy link

johntheprime commented Apr 9, 2021

I struggled with this problem for a long time and finally come up with a solution with reference from above. In case someone would come here for solutions, here is my working codes.

In your Dockerfile, you would add this for the wait-for-it.sh. The $APP_HOME is an ENV variable that you might define after FROM command for your specific project.

COPY wait-for-it.sh $APP_HOME/app

WORKDIR $APP_HOME/app

RUN chmod +x wait-for-it.sh

ENTRYPOINT ["/bin/bash", "-c"]

In your docker-compose.yml, you might add the following:

app:
  restart: on-failure
  command: ["./wait-for-it.sh db:3306 --strict --timeout=300 -- alembic upgrade head && python main.py"]

Note all the rest configurations were not mentioned here, but they could be found from other references as above.

jpadilla90 added a commit to jpadilla90/LMS-WP that referenced this issue Nov 8, 2021
Solución adaptada de esta miniguía:
vishnubob/wait-for-it#57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

16 participants