Using Docker's CMD to run a Shell Script + Get Output - docker

I've been using a docker file for about 6 months now without issue but after a few changes in compute engine, I'm hitting a weird issue where something in my start up script is behaving the way it should / it used to.
I have a shell script that does a couple tweaks to the environment before starting a web server which is started like so:
ADD src/docker/startup.sh /home/gauntface/docker/startup.sh
CMD /home/gauntface/docker/startup.sh
startup.sh echo's logs but I can't find a way to view these logs, does anyone have any advice?
docker logs shows nothing for my container
Additional Notes
I'm running the docker command with daemon mode. Without Daemon mode, docker throws this error:
the input device is not a TTY
The Docker file and start up script are here:
https://github.com/gauntface/gf-site/blob/staging/src/docker/Dockerfile-base
https://github.com/gauntface/gf-site/blob/staging/src/docker/startup.sh

docker logs by default will show the output from stdout/stderr:
$ docker run -it --name test-it busybox echo hello world
hello world
$ docker logs test-it
hello world
We'd need to know more about your shell script, what output it generates, and what debugging you've done to give a more detailed answer about why it's not working.

Related

Is there a way to turn off the output docker provides after "docker stop [container]" and docker start [container]?

I'm building my own backup script at the moment and therefore want to turn my docker instances on and off in a shell script.
So far this has been working perfectly, the only gripe I have with it is, that after it shuts down or starts a docker instance it throws the ID in the shell and I would love to get rid of that
docker start [containers]
4977db52f155
8063645c1a41
5b56a8ad3c72
65a0df7e8896
You can redirect the output to null.
docker stop [containers] > /dev/null 2>&1
or
docker stop [containers] &>/dev/null
https://www.cyberciti.biz/faq/how-to-redirect-output-and-errors-to-devnull/

My app can't create log files when it starts up inside Docker

I spent the weekend pouring over the Docker docs and playing around with the toy applications and example projects. I'm now trying to write a super-simple web service of my own and run it from inside a container. In the container, I want my app (a Spring Boot app under the hood) -- called bootup -- to have the following directory structure:
/opt/
bootup/
bin/
bootup.jar ==> the app
logs/
bootup.log ==> log file; GETS CREATED BY THE APP # STARTUP
config/
application.yml ==> app config file
logback.groovy ==> log config file
It's very important to note that when I run my app locally on my host machine - outside of Docker - everything works perfectly fine, including the creation of log files to my host's /opt/bootup/logs directory. The app endpoints serve up the correct content, etc. All is well and dandy.
So I created the following Dockerfile:
FROM openjdk:8
RUN mkdir /opt/bootup
RUN mkdir /opt/bootup/logs
RUN mkdir /opt/bootup/config
RUN mkdir /opt/bootup/bin
ADD build/libs/bootup.jar /opt/bootup/bin
ADD application.yml /opt/bootup/config
ADD logback.groovy /opt/bootup/config
WORKDIR /opt/bootup/bin
EXPOSE 9200
ENTRYPOINT java -Dspring.config=/opt/bootup/config -jar bootup.jar
I then build my image via:
docker build -t bootup .
I then run my container:
docker run -it -p 9200:9200 -d --name bootup bootup
I run docker ps:
CONTAINER ID IMAGE COMMAND ...
3f1492790397 bootup "/bin/sh -c 'java ..."
So far, so good!
My app should then be serving a simple web page at localhost:9200, so I open my browser to http://localhost:9200 and I get nothing.
When I use docker exec -it 3f1492790397 bash to "ssh" into my container, I see everything looks fine, except the /opt/bootup/logs directory, which should have a bootup.log file in it -- created at startup -- is instead empty.
I tried using docker attach 3f1492790397 and then hitting http://localhost:9200 in my browser, to see if that would generated some standard output (my app logs both to /opt/bootup/logs/bootup.log as well as the console) but that doesn't yield any output.
So I think what's happening is that my app (for some reason) doesn't have permission to create its own log file when the container starts up, and puts the app in a weird state, or even prevents it from starting up altogether.
So I ask:
Is there a way to see what user my app is starting up as?; or
Is there a way to tail standard output while the container is starting? Attaching after startup doesn't help me because I think by the time I run the docker attach command the app has already choked
Thanks in advance!
I don't know why your app isn't working, but can answer your questions-
Is there a way to see what user my app is starting up as?; or
A: Docker containers run as root unless otherwise specified.
Is there a way to tail standard output while the container is starting? Attaching after startup doesn't help me because I think by the time I run the docker attach command the app has already choked
A: Docker containers dump stdout/stderr to the Docker logs by default. There are two ways to see these- 1 is to run the container with the flag -it instead of -d to get an interactive session that will list the stdout from your container. The other is to use the docker logs *container_name* command on a running or stopped container.
docker attach 3f1492790397
This doesn't do what you are hoping for. What you want is docker exec (probably docker exec -it bootup bash), which will give you a shell in the scope of the container which will let you check for your log files or try and hit the app using curl from inside the container.
Why do I get no output?
Hard to say without the info from the earlier commands. Is your app listening on 0.0.0.0 or on localhost (your laptop browser will look like an external machine to the container)? Does your app require a supervisor process that isn't running? Does it require some other JAR files that are on the CLASSPATH on your laptop but not in the container? Are you running docker using Docker-Machine (in which case localhost is probably not the name of the container)?

Docker connection refused when started with -ti bash

I am new to docker and I tried to run the linuxconfig/lemp-php7 image. Everything worked fine and I could access the nginx web server installed on the container. To run this image I used this command:
sudo docker run linuxconfig/lemp-php7
When I tried to run the image with the following command to gain access over the container through bash I couldn't connect to nginx and I got the connection refused error message. Command: sudo docker run -ti linuxconfig/lemp-php7 bash
I tried this several times so I'm pretty sure it's not any kind of coincidence.
Why does this happen? Is this a problem specific to this particular image or is this a general problem. And how can I gain access to the shell of the container and access the web server at the same time?
I'd really like to understand this behavior to improve my general understanding of docker.
docker run runs the specified command instead of what that container would normally run. In your case, it appears to be supervisord, which presumably in turn runs the web server. So you're preventing any of that from happening.
My preferred method (except in cases where I'm trying to debug cases where the container won't even start properly) is to do the following after running the container normally:
docker exec -i -t $CONTAINER_ID /bin/bash

Logs of a docker container

Where does docker store it logs in the host machine as well as in the docker container. I know you can use docker logs . I want to know what is the physical location. Here is any example to illustrate more. I have got a java application which is generating standard output logs. I am using the following script to run it on a docker container
#!/bin/bash
nohup java -jar /opt/pubsub/publish.jar &
java -jar /opt/pubsub/subscribe.jar
I am unable to find my nohup in the container however I can see the content of nohup using docker logs . So where is my nohup??
Secondly where are the logs which are generated by docker itself?
They are stored in /var/lib/docker/containers
You can try docker-ci, it offers a solution to logging. It will watch the logs and send it to the client.
I hope this will help you.
http://docker-ci.org/documentation#remote-logging

Why is "docker start" outputting the name of the container?

I have a small minimal test container made using the ruby image. The ruby script is simple, and outputs the single string "Twitter".
When I first run the image and create the container, I get this output:
$ docker run -it --name my-running-script my-ruby-app
Twitter
Great so far - the script completes and the container exits.
But when I try to start it again, it first outputs the name of the container:
$ docker start -a my-running-script
my-running-script
Twitter
What is causing this output, and how can I get it to stop? (It's printed on stdout, and redirecting stderr doesn't help.)
I don't know if it's relevant, but this is running on OS X using boot2docker.
This is the expected behavior for docker start. Then you can do things like assign the containerID to a variable, etc.

Resources