Docker Tty Crashes
Introduction Docker makes it easy to wrap your applications and services in containers so you can run them anywhere. Unfortunately, problems may arise when building your image and integrating all of the layers that your app needs, especially if you're new to Docker images and containers. You may encounter typos, issues with runtime libraries and modules, naming collisions, or issues when communicating with other containers. In this troubleshooting guide aimed at people new to Docker, you'll troubleshoot problems when building Docker images, resolve naming collisions when running containers, and fix issues that come up when communication between containers. Prerequisites To complete this tutorial, you will need. Docker installed on a server or your local machine. To install Docker on a server, you can follow the how-to guides.
You can visit or follow to install Docker on your local machine. Step 1 — Resolving Problems with the Dockerfile The most common place you may run into issues is when you're building your Docker image from a Dockerfile. Before we dive in, let's clarify the difference between images and containers. An image is a read-only resource that you create using a configuration file called Dockerfile.
It's what you ship and share through or your private registry. A container, is a read and write instance that your create out of the image you built. You can learn more about these concepts in the tutorial.
When you look at a Dockerfile, you can clearly see the step-by-step process Docker uses build the image because each line in the Dockerfile corresponds to a step in the process. This generally means that if you got to a certain step, then all of the previous steps completed successfully. Let's create a little project to explore some issues you might encounter with a Dockerfile. Create a dockerimage directory in your home directory, and use nano or your favorite editor to create a Dockerfile in that folder.
Docker Tty Crashes Caught
mkdir /dockerimage. nano /dockerimage/Dockerfile Add the following content to this new file. OutputSending build context to Docker daemon 2.048 kB Step 1: FROM debian:latest - ddf73f48a05d Step 2: RUN apt-get install -qy nano - Running in 9679323b942f Reading package lists. Building dependency tree. E: Unable to locate package nano The command '/bin/sh -c apt-get install -qy nano' returned a non-zero code: 100 With the typo corrected, the process moved a little faster, since Docker cached the first step rather than redownloading the base image.
But as you can see from the output, we have a new error. The Debian distribution we've used as the foundation for our image couldn't find the text editor nano, even though we know it is available on the Debian package repositories. The base image comes with cached metadata, such as repositories and lists of available packages. You may occasionally experience some cache issues when the live repositories you're pulling data from have changed. To fix this, modify the Dockerfile to do a cleanup and update of the sources before you install any new packages. Open the configuration file again:.
nano /dockerimage/Dockerfile Add the following highlighted line to the file, above the command to install nano. OutputSending build context to Docker daemon 2.048 kB Step 1: FROM debian:latest - a24c3183e910 Step 2: RUN apt-get install -qy nano - Running in 2237d254f172 Reading package lists. Building dependency tree.
Reading state information. Suggested packages: spell The following NEW packages will be installed: nano. 64ff1d3d71d6 Removing intermediate container 2237d254f172 Successfully built 64ff1d3d71d6 Let's see what happens when we add Python 3 and the PostgreSQL driver to our image. Open the Dockerfile again. nano /dockerimage/Dockerfile And add two new steps to install Python 3 and the Python PostgreSQL driver.
/dockerimage/Dockerfile # base image FROM debian:latest # clean and update sources RUN apt-get clean && apt-get update # install basic apps RUN apt-get install -qy nano # install Python and modules RUN apt-get install -qy python3 RUN apt-get install -qy python3-psycopg2 Save the file, exit the editor, and build the image again:. docker build -t myimage /dockerimage As you can see from the output, the packages install correctly. The process also completes much more quickly because the previous steps were cached. OutputSending build context to Docker daemon 2.048 kB Step 1: FROM debian:latest - ddf73f48a05d Step 2: RUN apt-get clean && apt-get update - Using cache - 2c5013476fbf Step 3: RUN apt-get install -qy nano - Using cache - 4b77ac535cca Step 4: RUN apt-get install -qy python3 - Running in 93f2d795fefc Reading package lists.
Building dependency tree. Reading state information. OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 80a0ca58d6ec myimage 'bash' 22 seconds ago Up 28 seconds lovingbrahmagupta The name lovingbrahmagupta in the preceding output is the name that Docker automatically assigned to the container in the preceding example; yours will have a different name. Letting Docker assign a name to your container is fine in very simple cases, but can present significant problems; when we deploy we need to name containers consistently so we can reference them and automate them easily. To specify a name for a container we can either use the -name argument when we launch the container, or we can rename a running container to something more descriptive. Run the following command from the Docker host's terminal:.
docker rename yourcontainername pythonbox Then list your containers:. docker ps You'll see the pythonbox container in the output, confirming that you successfully renamed the container. Outputdocker: Error response from daemon: Conflict. The name '/pythonbox' is already in use by container 80a0ca58d6ecc80b305463aff2a68c4cbe36f7bda30fc5f9dda772. You have to remove (or rename) that container to be able to reuse that name. See 'docker run -help'.
When you build an image and reuse the name of an existing image, the existing image will be overwritten, as you've seen already. Containers are a little more complicated because you can't overwrite a container that already exists.
Docker says pythonbox already exists even though we just killed it and it's not even listed with docker ps. It's not running, but it's still available in case you want to start it up again. We stopped it, but we didn't remove it. The docker ps command only shows running containers, not all containers. To list all of the Docker containers, running and otherwise, pass the -a flag (alias for -all) to docker ps:. docker ps -a Now our pythonbox container appears in the output. OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 80a0ca58d6ec myimage 'bash' 12 minutes ago Exited (137) 6 minutes ago pythonbox The container exists with an Exited (137) status, which is why we ran into the naming problem when we tried to create a new container with the same name.
When you want to completely remove a container, you use the docker rm command. Execute this command in your terminal:. docker rm pythonbox Once again, Docker outputs the name of the container that was just removed. Outputpythonbox Warning: This command will fail and output an error message if the container is still running, so make sure you stop or kill it first. Let's create a new container named pythonbox now that we removed the previous one:.
docker run -name pythonbox -ti myimage bash The process completes and we are once again presented with a root shell:. Now let's kill and remove the container so we avoid problems in the future. From another Terminal session on the Docker host, kill the container and remove it with the following command:. docker kill pythonbox && docker rm pythonbox We chained two commands together, so the output shows the container name twice. The first output verifies we've killed the container, and the other confirms that we've removed it. Outputpythonbox pythonbox Keep docker ps -a in mind when experiencing issues with names and make sure that your containers are stopped and removed before you try to recreate them with the same name. Naming containers makes it easier for you to manage your infrastructure.
Names also make it easy to communicate between containers, as you'll see next. Step 3 — Resolving Container Communication Issues Docker makes it easy to instantiate several containers so you can run different or even redundant services in each one. If a service fails or gets compromised, you can just replace it with a new one while keeping the rest of the infrastructure intact.
But you may run into issues making those containers communicate with each other. Let's create two containers that communicate so we can explore potential communication issues. We'll create one container running Python using our existing image, and another container running an instance of PostgreSQL. We'll use the official PostgreSQL image available from for that container. Let's create the PostgreSQL container first.
We'll give this container a name by using the -name flag so that we can identify it easily when linking it with other containers. We'll call it postgresbox. Previously, when we launched a container, it ran in the foreground, taking over our terminal. We want to start the PostgreSQL database container in the background, which we can do with the -detach flag. Finally, instead of running bash, we'll run the postgres command which will start the PostgreSQL database server inside of the container.
Execute the following command to launch the container:. docker run -name postgresbox -detach postgres Docker will download the image from Docker Hub and create the container. It'll then return the full ID of the container running in the background. OutputUnable to find image 'postgres:latest' locally latest: Pulling from library/postgres 6a5a5368e0c2: Already exists 193f770cec44: Pull complete. 484ac0d6f901: Pull complete Digest: sha288891ce2e603c4bbe8491e7fa28d43a3fc792e302222a938ff4e6a349 Status: Downloaded newer image for postgres:latest f6609b9e96cc874be0852e400381db76a19ebfa4bd94fe326477b70b8f0aff65 List the containers to make sure this new container is running:.
docker ps The output confirms that the postgresbox container is running in the background, exposing port 5432, the PostgreSQL database port. OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7a230b56cd64 postgresbox '/docker-entrypoint.s' Less than a second ago Up 2 seconds 5432/tcp postgres Now let's launch the Python container.
In order for the programs running inside of the Python container to 'see' services in the postgresbox container, we need to manually link our Python container to the postgresbox container by using the -link argument. To create the link, we specify the name of the container, followed by the name of the link. We'll use the link name to refer to the postgresbox container from inside the Python container. Issue the following command to start the Python container:. docker run -name pythonbox -link postgresbox:postgres -ti myimage bash Now let's try to connect to PostgreSQL from inside the pythonbox container. We previously installed nano inside of the pythonbox container so let's use it to create a simple Python script to test the connection to PostgreSQL. In the terminal for the pythonbox container, execute this command:.
nano pgtest.py Then add the following Python script to the file. OutputTraceback (most recent call last): File 'pgtest.py', line 5, in conn = psycopg2.connect(database='test', user='postgres', password='secret') File '/usr/lib/python3/dist-packages/psycopg2/init.py', line 164, in connect conn = connect(dsn, connectionfactory=connectionfactory, async=async) psycopg2.OperationalError: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket '/var/run/postgresql/.s.PGSQL.5432'? We've ensured the postgresbox container is running and we've linked it to the pythonbox container, so then what happened? Well, we never specified the database host when we tried to connect, so Python tries to connect to a database running locally, and that won't work because the service isn't running locally, it is running in a different container just as if it was on a different computer.
You can access the linked container using the name you set up when you created the link. In our case, we use postgres to reference the postgresbox container that's running our database server. You can verify this by viewing the /etc/hosts file within the pythonbox container:.
cat /etc/hosts You will see all of the available hosts with their names and IP addresses. Our postgres server is clearly visible. Output Keep container names in mind when you're trying to connect to services in other containers, and edit your application credentials to reference the linked names of those containers. Conclusion We just covered the most common issues you may encounter when working with Docker containers, from building images to deploying a network of containers. Docker has a -debug flag which is intended mainly for Docker developers. However, if want to know more about Docker internals, try running Docker commands in debug mode for more verbose output:. docker -D command arguments While containers in software have existed for some time, Docker itself has existed for only three years and can be quite complex.
Take your time to get familiar with the terms and, and you'll see how some concepts that were a bit foreign at first will soon make a lot of sense.
+ docker login -u $DOCKERUSERNAME -p $DOCKERPASSWORD Error: Cannot perform an interactive login from a non TTY device The full yml is: pipelines: branches: master: - step: script: - echo '$DOCKERUSERNAME $DOCKERPASSWORD' - docker build -t s4ysolutions/spartan-resume-server -f docker/server.Dockerfile. docker login -u $DOCKERUSERNAME -p $DOCKERPASSWORD - docker push s4ysolutions/spartan-resume-server # - docker build -t s4ysolutions/spartan-resume-front -f docker/front.Dockerfile. #- docker push s4ysolutions/spartan-resume-front options: docker: true. I had exactly the same issue. Then I realized that in another repo it worked. So then I realized each Repo needs to have it's own environment variables set up.
If you don't set up the DOCKERUSERNAME and DOCKERPASSWORD in your example under the 'Environment variables' section in the Repository settings, it would raise that confusing docker terminal (tty) error. Can find the settings probably in this URI: /admin/addon/admin/pipelines/repository-variables Once I fixed that, it worked fine. I guess you already figured that out:) but for others to come.