Same here.
docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-05-15 15:43:17 SAST; 2min 24s ago
Docs: https://docs.docker.com
Main PID: 26981 (dockerd)
Tasks: 29
Memory: 101.8M
CPU: 3.806s
CGroup: /system.slice/docker.service
├─26981 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
└─27289 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.2 -container-port 80
...
May 15 15:43:17 skp-mint systemd[1]: Started Docker Application Container Engine.
Содержание
- «docker events» not showing service events #101
- Comments
- Expected behavior
- Actual behavior
- Steps to reproduce the behavior
- docker system events
- Usage
- Description
- Object types
- Containers
- Images
- Plugins
- Volumes
- Networks
- Daemons
- Limiting, filtering, and formatting the output
- Limit events by time
- Filtering (—filter)
- Options
- Examples
- Basic example
- Filter events by time
- Filter events by criteria
- Format the output (—format)
- docker events
- Usage
- Description
- Object types
- Containers
- Images
- Plugins
- Volumes
- Networks
- Daemons
- Services
- Nodes
- Secrets
- Configs
- Limiting, filtering, and formatting the output
- Limit events by time (—since, —until)
- Filtering (—filter)
- Format the output (—format)
- Options
- Examples
- Basic example
- Filter events by time
- Filter events by criteria
- Docker OOM event handling inappropriate #670
- Comments
- Expected behavior
- Actual behavior
- Steps to reproduce the behavior
«docker events» not showing service events #101
- This is a bug report
- This is a feature request
- I searched existing issues before opening this one
Expected behavior
docker events should show events regarding the creation of services.
Actual behavior
docker events doesn’t show events regarding the creation of services.
Steps to reproduce the behavior
I’m using a cluster of three manager nodes and use docker events on each of them. I then create a service like $ docker service create —name test nginx
I only get the following events:
Output of docker version :
Output of docker info :
Additional environment details (AWS, VirtualBox, physical, etc.)
Two of the nodes are Ubuntu 14.04, the third one is Ubuntu 16.04.. All of them are on an internal network.
The text was updated successfully, but these errors were encountered:
I’m not able to reproduce this. See the steps I used to try and reproduce:
On manager 1, start the docker events :
On manager 2, create, update, and remove a service:
Back on manager1, see the events that were received:
(note that container create/destroy events are not shown, because the tasks did not end up on the manager 1 node)
Are you running the docker events command on a manager? If the node you’re running the command on is not a manager, you’d only see container events, not swarm events.
Yes, docker events is running on a manager. However, I still don’t see those events when following your steps. As I can see the service when running docker service ls on the manager where docker events ran I guess this not caused by a communication error between the nodes.
Strange thing: On a second cluster (consisting of only Ubuntu 16.04) it just works. I then rebooted all of the nodes in the «buggy» cluster, after that it worked. Considering that rebooting «fixes» the other problem I sometimes have (see moby/moby#33430) I’m just accepting this as a little quirk and try to reboot those nodes regularly.
Same problem here.
After some time, our Swarm cluster (3x management nodes on 17.09) stopped generating «type=service» events. I have confirmed it by both docker events -f type=service and Python docker client. I haven’t tried yet if reboot will fix the problem.
Same issue here. For me, not even container events showed up.
I could not restart the nodes, as I’m using docker4aws, but slowly removing one node after the other and waiting for docker4aws to recreate them, the swarm propagated all service events properly in the end.
I have 3x managers running 17.12.1-ce. I wrote a microservice which pings slack with service updates, but it will go silent if the manager stops generating these events. I’ve just noticed the events stopped occurring on one of the managers, so I did a docker service update —force to move it to another manager, which seems to be working just fine. You can see the info for the managers below. Unfortunately, I can’t restart these nodes with zero downtime because live restore isn’t enabled. Maybe I’ll do it at some point later, perhaps enabling live restore.
Источник
docker system events
Get real time events from the server
Usage
Refer to the options section for an overview of available OPTIONS for this command.
Description
Use docker system events to get real-time events from the server. These events differ per Docker object type.
Object types
Containers
Docker containers report the following events:
- attach
- commit
- copy
- create
- destroy
- detach
- die
- exec_create
- exec_detach
- exec_die
- exec_start
- export
- health_status
- kill
- oom
- pause
- rename
- resize
- restart
- start
- stop
- top
- unpause
- update
Images
Docker images report the following events:
Plugins
Docker plugins report the following events:
Volumes
Docker volumes report the following events:
Networks
Docker networks report the following events:
Daemons
Docker daemons report the following events:
Limiting, filtering, and formatting the output
Limit events by time
The —since and —until parameters can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. 10m , 1h30m ) computed relative to the client machine’s time. If you do not provide the —since option, the command returns only new and/or live events. Supported formats for date formatted time stamps include RFC3339Nano, RFC3339, 2006-01-02T15:04:05 , 2006-01-02T15:04:05.999999999 , 2006-01-02Z07:00 , and 2006-01-02 . The local timezone on the client will be used if you do not provide either a Z or a +-00:00 timezone offset at the end of the timestamp. When providing Unix timestamps enter seconds[.nanoseconds], where seconds is the number of seconds that have elapsed since January 1, 1970 (midnight UTC/GMT), not counting leap seconds (aka Unix epoch or Unix time), and the optional .nanoseconds field is a fraction of a second no more than nine digits long.
Filtering (—filter)
The filtering flag ( -f or —filter ) format is of “key=value”. If you would like to use multiple filters, pass multiple flags (e.g., —filter «foo=bar» —filter «bif=baz» )
Using the same filter multiple times will be handled as a OR; for example —filter container=588a23dac085 —filter container=a8f7720b8c22 will display events for container 588a23dac085 OR container a8f7720b8c22
Using multiple filters will be handled as a AND; for example —filter container=588a23dac085 —filter event=start will display events for container container 588a23dac085 AND the event type is start
The currently supported filters are:
- container ( container= )
- daemon ( daemon= )
- event ( event= )
- image ( image= )
- label ( label= or label= = )
- network ( network= )
- plugin ( plugin= )
- type ( type= )
- volume ( volume= )
For example uses of this command, refer to the examples section below.
Options
Name, shorthand | Default | Description |
—filter , -f | Filter output based on conditions provided | |
—format | Format the output using the given Go template | |
—since | Show all events created since timestamp | |
—until | Stream events until this timestamp |
Examples
Basic example
You’ll need two shells for this example.
Shell 1: Listening for events:
Shell 2: Start and Stop containers:
Shell 1: (Again .. now showing events):
To exit the docker system events command, use CTRL+C .
Filter events by time
You can filter the output by an absolute timestamp or relative time on the host machine, using the following different time syntaxes:
Filter events by criteria
The following commands show several different ways to filter the docker event output.
Format the output (—format)
If a format ( —format ) is specified, the given template will be executed instead of the default format. Go’s text/template package describes all the details of the format.
Источник
docker events
Get real time events from the server
Usage
Refer to the options section for an overview of available OPTIONS for this command.
Description
Use docker events to get real-time events from the server. These events differ per Docker object type. Different event types have different scopes. Local scoped events are only seen on the node they take place on, and swarm scoped events are seen on all managers.
Only the last 1000 log events are returned. You can use filters to further limit the number of events returned.
Object types
Containers
Docker containers report the following events:
- attach
- commit
- copy
- create
- destroy
- detach
- die
- exec_create
- exec_detach
- exec_die
- exec_start
- export
- health_status
- kill
- oom
- pause
- rename
- resize
- restart
- start
- stop
- top
- unpause
- update
Images
Docker images report the following events:
Plugins
Docker plugins report the following events:
Volumes
Docker volumes report the following events:
Networks
Docker networks report the following events:
Daemons
Docker daemons report the following events:
Services
Docker services report the following events:
Nodes
Docker nodes report the following events:
Secrets
Docker secrets report the following events:
Configs
Docker configs report the following events:
Limiting, filtering, and formatting the output
Limit events by time (—since, —until)
The —since and —until parameters can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. 10m , 1h30m ) computed relative to the client machine’s time. If you do not provide the —since option, the command returns only new and/or live events. Supported formats for date formatted time stamps include RFC3339Nano, RFC3339, 2006-01-02T15:04:05 , 2006-01-02T15:04:05.999999999 , 2006-01-02Z07:00 , and 2006-01-02 . The local timezone on the client will be used if you do not provide either a Z or a +-00:00 timezone offset at the end of the timestamp. When providing Unix timestamps enter seconds[.nanoseconds], where seconds is the number of seconds that have elapsed since January 1, 1970 (midnight UTC/GMT), not counting leap seconds (aka Unix epoch or Unix time), and the optional .nanoseconds field is a fraction of a second no more than nine digits long.
Only the last 1000 log events are returned. You can use filters to further limit the number of events returned.
Filtering (—filter)
The filtering flag ( -f or —filter ) format is of “key=value”. If you would like to use multiple filters, pass multiple flags (e.g., —filter «foo=bar» —filter «bif=baz» )
Using the same filter multiple times will be handled as a OR; for example —filter container=588a23dac085 —filter container=a8f7720b8c22 will display events for container 588a23dac085 OR container a8f7720b8c22
Using multiple filters will be handled as a AND; for example —filter container=588a23dac085 —filter event=start will display events for container container 588a23dac085 AND the event type is start
The currently supported filters are:
- config ( config= )
- container ( container= )
- daemon ( daemon= )
- event ( event= )
- image ( image= )
- label ( label= or label= = )
- network ( network= )
- node ( node= )
- plugin ( plugin= )
- scope ( scope= )
- secret ( secret= )
- service ( service= )
- type ( type= )
- volume ( volume= )
Format the output (—format)
If a format ( —format ) is specified, the given template will be executed instead of the default format. Go’s text/template package describes all the details of the format.
If a format is set to <> , the events are streamed as valid JSON Lines. For information about JSON Lines, please refer to https://jsonlines.org/.
For example uses of this command, refer to the examples section below.
Options
Name, shorthand | Default | Description |
—filter , -f | Filter output based on conditions provided | |
—format | Format the output using the given Go template | |
—since | Show all events created since timestamp | |
—until | Stream events until this timestamp |
Examples
Basic example
You’ll need two shells for this example.
Shell 1: Listening for events:
Shell 2: Start and Stop containers:
Shell 1: (Again .. now showing events):
To exit the docker events command, use CTRL+C .
Filter events by time
You can filter the output by an absolute timestamp or relative time on the host machine, using the following different time syntaxes:
Filter events by criteria
The following commands show several different ways to filter the docker event output.
Источник
Docker OOM event handling inappropriate #670
- This is a bug report
- This is a feature request
- I searched existing issues before opening this one
Expected behavior
Not logging things blindly, be more cautious about outputing.
Blindly logging everything can pose a severe denial of service risk by exhausting system resources. Suggest aggregating similar log messages in some way to handle (especially) OOM event more appropriately.
Actual behavior
containerd continues to bubble up OOM events and dockerd blindly log such events.
For us this is a huge issue because the consequence has been dockerd generating a continuous rate of 10Mbps of log output observed on our systems and eventually exhausted all 80GB of system RAM per node + all disk spaces if not caught in time by us, which leads to a denial of service.
We limit our user’s resources but we have no control over what they run, but once OOM occurs by resource limits, dockerd is at fault for consuming the rest and majority of system resources by logging recurring OOM events.
Steps to reproduce the behavior
Make a container with resource limits (we did this through RKE Kubernetes) and continually allocate memory till OOM triggers.
An actual example we caught was setting a container memory limit at 4G and load a 5G csv file using read.csv() from R language. And it has caused dockerd to continually generate a massive amount of logs eventually jammed our system.
Output of docker version :
Client:
Version: 18.09.0
API version: 1.39
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:48:22 2018
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine — Community
Engine:
Version: 18.09.4
API version: 1.39 (minimum version 1.12)
Go version: go1.10.8
Git commit: d14af54
Built: Wed Mar 27 18:04:46 2019
OS/Arch: linux/amd64
Experimental: false
Output of docker info :
Containers: 42
Running: 23
Paused: 0
Stopped: 19
Images: 61
Server Version: 18.09.4
Storage Driver: devicemapper
Pool Name: docker-thinpool
Pool Blocksize: 524.3kB
Base Device Size: 10.74GB
Backing Filesystem: xfs
Udev Sync Supported: true
Data Space Used: 112.2GB
Data Space Total: 765GB
Data Space Available: 652.9GB
Metadata Space Used: 70.76MB
Metadata Space Total: 8.049GB
Metadata Space Available: 7.978GB
Thin Pool Minimum Free Space: 76.5GB
Deferred Removal Enabled: true
Deferred Deletion Enabled: true
Deferred Deleted Device Count: 0
Library Version: 1.02.149-RHEL7 (2018-07-20)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: bb71b10fd8f58240ca47fbb579b9d1028eea7c84
runc version: 2b18fe1d885ee5083ef9f0838fee39b62d653e30
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 5.0.7-1.el7.elrepo.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 18
Total Memory: 78.66GiB
Name: k-prod-cpu-6.dsa.lan
ID: S65O:V6T3:PQ2L:KKKW:PSC6:DTDJ:6ITH:KICE:EFWX:DQT3:NBSP:XSND
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
WARNING: bridge-nf-call-ip6tables is disabled
WARNING: the devicemapper storage-driver is deprecated, and will be removed in a future release.
Additional environment details (AWS, VirtualBox, physical, etc.)
The text was updated successfully, but these errors were encountered:
Источник
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
Error al usar docker Station
I have installed Docker Desktop v3.5.2 and DockStation v1.5.1 and get an error suggesting Docker Compose is not installed.
Docker is running and I can see Docker Composed is installed on my machine at C:Program FilesDockerDockerresourcesbin
To try and resolve this myself I have tried a full uninstall / reinstall, I have manually installed WSL2, I have turned on hyper-V, but I just cannot get the error to resolve itself (along with multiple reboots).
Looking for suggestions on what to try next.
When i try to run Dockstation, it prompt out this error.
Firebase not connecting well on my ISP and for the first connection (like login as guest or login with google) application triggers error of network problem (like timeout ..
My guess is that the command is not passed as a string so bash just runs «docker»
Hello,
Docker is installed cleanly on a Ubuntu 16.04.2. When I installed DockStation and run it, it says docker isn’t running. Though I can run docker run hello-world and get a response am I missing something.
When i set compose options up to something, like nginx, when i start a service it errors: ‘nginx mysql redis workspace’, if i clean the compose option up to blank, it then works…
Im using laradock (https://laradock.io/getting-started/)
Running on OSX Catalina. Docker desktop 2.2.0.4, Compose 1.25.4
I’m currently using Traefik as a reverse proxy for my services in docker.
As far as I can see there is no easy/simple way to edit the labels of the docker other than using the plain docker-compose file?
Hi,
Are there any plans to support the native window decoration of the current linux desktop instead of forcing that mac-like one ? IMO in linux the app should respect the window decoration of the desktop in use has, not everyone likes mac os x and becomes very annoying to use, the same with the forced full screen, it should be possible to maximize the app without going full screen covering the desktop panels.
Thanks.
Hello, can I access the docker in the intranet server? Because I’ve tried it many times, but I can’t access it. Instead, I can connect to the docker on the Internet.
Thanks for the really nice tool.
I really like the remote connection and monitoring that dockstation supports. Can projects/docker-compose files be also deployed on the remote host that we have established a connection to.
I m having problem with connecting from my personal computer to remote machine, where docker is running.
I cant say that I configured ssh properly on remote machine, but i didnt do much in sshd_config file, i left it like it is.
Now when i go to terminal and type ssh username@host everything works fine, but when i try the to go through dockStation
it fails.
Message it outputs:
Establishin ssh connection…
handling ssh connection error.Error:connect ECONNREFUSED host -> this message displays even before it asks me for password
There were two issues complaining that the fonts were too small. Then the font size got increased, but it’s way too big now. I think you guys should provide a hook to allow us to select our scaling or font size, either by adding some sort of switch to the command used to launch the app or by providing some kind of preference.
Currently our project is setup so we have different containers that can be sprung up by combining a base compose file with an override.
e.g. Setup A = docker-compose.yml + A.yml
Setup B = docker-compose.yml + B.yml
I was hoping to have each setup as it’s own project but I can’t create duplicate projects as they share the same path to the base docker-compose file. I get the message «Selected path is used by other project!»
Is there a work around? Or is it possible to change this, perhaps validate on the constructed docker-compose command instead of file path to the base compose?
GConf2 is long dead, last release was in 2013, and Gnome marked it as Obsolete in 2011 when Gnome3 was launched. Please switch to DConf!
2 декабря, 2016 12:01 пп
27 054 views
| Комментариев нет
Centos, Ubuntu
Docker позволяет заключать приложения и сервисы в контейнеры. Однако во время создания образа или объединения слоев иногда возникают ошибки. Причиной ошибки может быть опечатка, проблемы библиотек поддержки, конфликт имен, сбой взаимодействия между контейнерами.
Данное руководство по устранению неполадок предназначено для новичков Docker. Руководство поможет вам устранить проблемы при сборке образов и настройке соединений между контейнерами.
Требования
Для выполнения руководства нужно предварительно установить приложение Docker. Инструкции по установке можно найти по ссылкам:
- Установка и использование Docker в Ubuntu 16.04
- Установка и использование Docker в CentOS 7
Также вы можете посетить сайт Docker или следовать официальной документации по установке.
1: Ошибки в Dockerfile
Наибольшее количество ошибок обычно сосредоточено в Dockerfile.
Прежде чем приступить к исправлению ошибок, нужно понять разницу между образом и контейнером.
Образ Docker – это ресурс, предназначенный только для чтения, который создаётся с помощью файла под названием Dockerfile. Образы можно выкладывать на Docker Hub.
Контейнер – это экземпляр приложения, который создаётся с помощью образа.
Читайте также: Экосистема Docker: основы контейнеризации
Dockerfile подробно описывает пошаговый процесс, с помощью которого Docker создаёт образ. Каждая строка в Dockerfile описывает один из этапов процесса. Таким образом, если Docker переходит на новый этап, значит, предыдущие этапы выполнены без ошибок.
Создайте небольшой проект, чтобы на его примере рассмотреть несколько общих ошибок Dockerfile. Создайте каталог docker_image в домашнем каталоге. Затем создайте в нём Dockerfile.
mkdir ~/docker_image
nano ~/docker_image/Dockerfile
Добавьте в файл такие строки:
# base image
FROM debian:latest
# install basic apps
RUN aapt-get install -qy nano
В этом файле специально сделана опечатка. Можете её найти? Попробуйте создать образ с помощью этого файла и посмотрите, что скажет Docker.
docker build -t my_image ~/docker_image
Команда вернёт:
Step 2 : RUN aapt-get install -qy nano
---> Running in 085fa10ffcc2
/bin/sh: 1: aapt-get: not found
The command '/bin/sh -c aapt-get install -qy nano' returned a non-zero code: 127
Из этого сообщения об ошибке следует, что во второй команде допущена ошибка. Как уже говорилось, это сделано намеренно: вместо команды apt-get в файле указана команда aapt-get. Первый этап выполнен без ошибок, а на втором Docker обнаруживает опечатку.
Исправьте опечатку в Dockerfile:
# install basic apps
RUN apt-get install -qy nano
Снова запустите docker build:
docker build -t my_image ~/docker_image
Команда вернёт:
Sending 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
Теперь процесс проходил немного быстрее: Docker кэширует удачно выполненные этапы, чтобы потом не перевыполнять их. Однако потом возникла новая ошибка.
Дистрибутив Debian, на котором основан образ, не может найти текстовый редактор nano, хотя он точно доступен в репозитории Debian. Базовый образ собирается из кэшированных метаданных: репозиториев и списков доступных пакетов. Вероятно, при кэшировании произошла ошибка.
Чтобы исправить её, отредактируйте Dockerfile и добавьте в него чистку и обновление исходных файлов перед установкой новых пакетов:
nano ~/docker_image/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
Сохраните и закройте файл. Запустите docker build:
docker build -t my_image ~/docker_image
Теперь процесс будет выполнен успешно:
Sending 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
Добавьте в образ Python 3 и базу данных PostgreSQL. Откройте Dockerfile:
nano ~/docker_image/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
Сохраните и закройте файл. Соберите образ.
docker build -t my_image ~/docker_image
Как видите, все пакеты установлены без ошибок. Кроме того, процесс выполняется очень быстро, поскольку большинство его этапов помещено в кэш.
Sending 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...
The following extra packages will be installed:
krb5-locales libgmp10 libgnutls-deb0-28 libgssapi-krb5-2 libhogweed2
libk5crypto3 libkeyutils1 libkrb5-3 libkrb5support0 libldap-2.4-2 libnettle4
libp11-kit0 libpq5 libsasl2-2 libsasl2-modules libsasl2-modules-db
libtasn1-6
Suggested packages:
gnutls-bin krb5-doc krb5-user libsasl2-modules-otp libsasl2-modules-ldap
libsasl2-modules-sql libsasl2-modules-gssapi-mit
libsasl2-modules-gssapi-heimdal python-psycopg2-doc
The following NEW packages will be installed:
krb5-locales libgmp10 libgnutls-deb0-28 libgssapi-krb5-2 libhogweed2
libk5crypto3 libkeyutils1 libkrb5-3 libkrb5support0 libldap-2.4-2 libnettle4
libp11-kit0 libpq5 libsasl2-2 libsasl2-modules libsasl2-modules-db
libtasn1-6 python3-psycopg2
0 upgraded, 18 newly installed, 0 to remove and 0 not upgraded.
Need to get 5416 kB of archives.
After this operation, 10.4 MB of additional disk space will be used.
...
Processing triggers for libc-bin (2.19-18+deb8u6) ...
---> 978e0fa7afa7
Removing intermediate container d7d4376c9f0d
Successfully built 978e0fa7afa7
Примечание: Docker кэширует процесс сборки. Потому иногда при сборке образа используются устаревшие исходные файлы. Чтобы избежать этого, добавьте в Dockerfile чистку и обновление исходников. Если при установке или обновлении пакетов возникает ошибка, запустите внутри контейнера команду:
apt-get clean && apt-get update
Внимательно читайте вывод Docker, чтобы отследить опечатки. Своевременно обновляйте исходные файлы, чтобы избежать ошибок, вызванных кэшированными списками пакетов.
Синтаксические ошибки и ошибки кэширования – наиболее распространенные проблемы, с которыми вы можете столкнуться при создании образа Docker. Теперь давайте рассмотрим проблемы, которые могут возникнуть при работе с контейнерами, созданными на основе этих образов.
2: Конфликты имён
Чем больше вы запускаете контейнеров, тем выше вероятность возникновения конфликта имён.
К примеру, иногда при создании контейнера пользователи пытаются использовать имя, которое ранее было присвоено другому контейнеру в этой системе. Данный раздел научит вас выбирать имена для контейнеров, переименовывать и удалять их, чтобы устранить конфликт имён.
Используйте созданный ранее образ, чтобы запустить контейнер. Затем, чтобы протестировать его работу, запустите интерактивный интерпретатор bash внутри этого контейнера.
docker run -ti my_image bash
После запуска контейнера вы увидите командную строку root:
root@80a0ca58d6ec: / #
Теперь давайте рассмотрим проблемы, которые могут возникнуть в контейнере.
Запуская контейнер так, как показано выше, не указывая имя, Docker присваивает ему случайное имя. Чтобы просмотреть список запущенных контейнеров, запустите на хосте Docker команду:
docker ps
Примечание: Команду нужно запускать вне контейнера.
Откройте терминал хоста Docker и запустите:
docker ps
Эта команда выведет список запущенных контейнеров:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
80a0ca58d6ec my_image "bash" 22 seconds ago Up 28 seconds loving_brahmagupta
Как видите, Docker выбрал для только что запущенного контейнера случайное имя, и в данном случае это loving_brahmagupta (вероятно, в вашем случае имя будет отличаться). Позволять Docker присваивать контейнерам случайные имена можно в некоторых простых случаях. Однако это может повлечь серьёзные проблемы. При развёртывании объемного проекта нужно присвоить контейнерам имена самостоятельно, чтоб иметь возможность ссылаться на них и автоматизировать их работу.
Чтобы задать имя контейнера, используйте при запуске аргумент –name. Также вы можете переименовать запущенный контейнер. Имя контейнера должно быть описательным.
Запустите следующую команду в терминале хоста Docker:
docker rename your_container_name python_box
Запросите список контейнеров:
docker ps
Теперь контейнер loving_brahmagupta называется python_box:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
80a0ca58d6ec my_image "bash" 24 minutes ago Up 24 minutes python_box
Чтобы закрыть контейнер, введите exit в командную строку:
root@80a0ca58d6ec: / # exit
Также контейнер можно остановить с помощью команды kill из другого терминала хоста Docker:
docker kill python_box
В таком случае Docker возвращает имя остановленного контейнера:
python_box
Чтобы убедиться, что контейнер python_box остановлен, запросите список контейнеров:
docker ps
Контейнер python_box в списке нет:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Вы думаете, что теперь можно запустить другой контейнер с именем python_box? Что ж, попробуйте сделать это:
docker run --name python_box -ti my_image bash
docker: Error response from daemon: Conflict. The name "/python_box" is already in use by container 80a0ca58d6ecc80b305463aff2a68c4cbe36f7bda15e680651830fc5f9dda772. You have to remove (or rename) that container to be able to reuse that name..
See 'docker run --help'.
Если вы собираете образ, а затем хотите повторно использовать имя существующего образа, этот образ будет переписан. Контейнеры работают немного сложнее: вы не можете переписать существующий контейнер.
Итак, Docker говорит, что контейнер python_box уже существует, хотя только что этот контейнер был остановлен. Его даже нет в списке команды docker ps. Да, на данный момент он не запущен, но он всё ещё доступен. Вы остановили, но не удалили его. Команда docker ps показывает не все доступные, а только запущенные контейнеры.
Чтобы запросить список всех контейнеров, нужно добавить флаг –а:
docker ps -a
Как видите, python_box всё-таки в списке:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
80a0ca58d6ec my_image "bash" 12 minutes ago Exited (137) 6 minutes ago python_box
Контейнер существует, его состояние – Exited (137). Потому пока что вы не можете создать контейнер с таким же именем: для этого нужно удалить контейнер.
Чтобы сделать это, введите в терминал:
docker rm python_box
Docker выведет на экран имя удалённого контейнера.
python_box
Примечание: Если контейнер, который нужно удалить, всё ещё запущен, команда не сможет удалить его и вернёт ошибку.
Теперь попробуйте снова создать контейнер по имени python_box:
docker run --name python_box -ti my_image bash
Процесс будет успешно выполнен, а на экране появится оболочка root:
root@c05ac9d0c010: / #
Теперь остановите и удалите этот контейнер, чтобы избежать ошибок при дальнейшей работе. Откройте новый терминал на хосте Docker и выполните команду:
docker kill python_box && docker rm python_box
Эта команда состоит из двух команд, потому Docker выведет имя контейнера дважды:
python_box
python_box
При возникновении конфликтов имён используйте команду docker ps -a
Самостоятельно присваивая имена контейнерам, вы можете легко управлять инфраструктурой. Кроме того, так гораздо проще устанавливать взаимодействие между контейнерами.
3: Проблемы взаимодействия контейнеров
Докер может легко обрабатывать несколько контейнеров, благодаря чему вы можете запускать различные сервисы и даже дублировать сервисы в контейнерах. Если с одним из сервисов случился сбой или его взломали, вы можете просто заменить его другим, сохраняя при этом остальную часть инфраструктуры нетронутой. Но вы можете столкнуться с проблемами при настройке взаимодействия между этими контейнерами.
Создайте два взаимодействующих между собой контейнера: пусть первый будет контейнером Python на основе уже существующего образа, а второй будет запускать PostgreSQL.
Примечание: Официальный образ для контейнера PostgreSQL можно найти на Docker Hub.
Сначала создайте контейнер PostgreSQL. Присвойте ему имя с помощью аргумента –name (например, postgres_box).
Прежде контейнеры запускались на переднем плане, занимая терминал. Теперь нужно запустить контейнер PostgreSQL в фоновом режиме. Для этого используется флаг –detach.
Вместо команды bash запустите в контейнере команду postgres, которая запустит сервер баз данных PostgreSQL.
docker run --name postgres_box --detach postgres
Docker загрузит образ с Docker Hub и создаст контейнер. Затем он вернёт полный ID контейнера, запущенного в фоновом режиме:
Unable to find image 'postgres:latest' locally
latest: Pulling from library/postgres
6a5a5368e0c2: Already exists
193f770cec44: Pull complete
...
484ac0d6f901: Pull complete
Digest: sha256:924650288891ce2e603c4bbe8491e7fa28d43a3fc792e302222a938ff4e6a349
Status: Downloaded newer image for postgres:latest
f6609b9e96cc874be0852e400381db76a19ebfa4bd94fe326477b70b8f0aff65
Просмотрите список запущенных контейнеров:
docker ps
В списке вы увидите запущенный в фоновом режиме контейнер postgres_box, который использует порт 5432 (стандартный порт PostgreSQL)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a230b56cd64 postgres_box "/docker-entrypoint.s" Less than a second ago Up 2 seconds 5432/tcp postgres
Теперь запустите контейнер Python. Чтобы программы внутри контейнера Python могли видеть сервисы внутри контейнера postgres_box, нужно вручную связать эти контейнеры с помощью флага –link.
Чтобы создать ссылку, нужно указать имя контейнера, а затем, после флага –link, задать имена контейнеров, которые нужно связать. В данном случае команда будет выглядеть так:
docker run --name python_box --link postgres_box:postgres -ti my_image bash
Попробуйте подключиться к PostgreSQL из контейнера python_box.
Ранее вы установили nano в python_box. Используйте этот текстовый редактор, чтобы создать простой сценарий Python и подключиться к PostgreSQL. В терминал контейнера python_box введите:
root@3053f74c8c13: / # nano pg_test.py
Добавьте в файл:
"""Test PostgreSQL connection."""
import psycopg2
conn = psycopg2.connect(user='postgres')
print(conn)
Сохраните и закройте файл. Попробуйте подключиться к БД с помощью этого сценария:
root@3053f74c8c13: / # python3 pg_test.py
В выводе говорится о том, что во время подключения произошла ошибка:
Traceback (most recent call last):
File "pg_test.py", line 5, in <module>
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, connection_factory=connection_factory, 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"?
Итак, контейнер postgres_box запущен и связан с python_box. В чём же проблема? Дело в том, что во время соединения не был указан хост БД, потому Python пытается подключиться к ней локально. Но это не сработает, так как сервис запущен не локально – он работает в другом контейнере, а это то же самое, что на другом компьютере.
Вы можете получить доступ к связанным контейнерам, указав имя, использованное в ссылке. В данном случае мы используем postgres для ссылки на контейнер postgres_box, который запускает сервер базы данных. Вы можете убедиться в этом, просмотрев файл /etc/hosts внутри контейнера python_box:
root@3053f74c8c13: / # cat /etc/hosts
Вы увидите все доступные хосты, их имена и IP. Сервер postgres тоже в списке:
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 postgres f6609b9e96cc postgres_box
172.17.0.3 3053f74c8c13
Отредактируйте сценарий Python и добавьте в него имя хоста. Откройте файл:
root@3053f74c8c13: / # nano pg_test.py
Укажите имя хоста:
"""Test PostgreSQL connection."""
import psycopg2
conn = psycopg2.connect(host='postgres', user='postgres')
print(conn)
Сохраните и закройте файл. Снова запустите сценарий:
root@3053f74c8c13: / # python3 pg_test.py
Теперь сценарий выполнен успешно:
<connection object at 0x7f64caec69d8; dsn: 'user=postgres host=7a230b56cd64', closed: 0>
Запоминайте имена контейнеров, чтобы иметь возможность подключаться к сервисам внутри этих контейнеров.
Заключение
В данном руководстве мы рассмотрели наиболее распространенные проблемы, с которыми можно столкнуться при работе с контейнерами Docker: от создания образов и до развертывания сетей контейнеров.
Docker предоставляет флаг –debug. В основном этим флагом пользуются разработчики Docker. Однако если вы хотите узнать больше о внутреннем строении Docker, попробуйте запустить команды Docker в режиме отладки (это вернёт более подробный вывод):
docker -D [command] [arguments]
Контейнеры программного обеспечения существуют уже некоторое время, а сама система Docker – всего три года, потому иногда с ней бывает сложно. Чем чаще вы будете работать с Docker, тем больше у вас будет опыта: вы будете знать подводные камни, научитесь быстро справляться с рутинными задачами и устранять ошибки.
Читайте также:
- Экосистема Docker: базовые компоненты
- Экосистема Docker: основы контейнеризации
- Экосистема Docker: обнаружение сервисов и распределённые хранилища конфигураций
- Экосистема Docker: планирование и оркестровка
Tags: Docker, Dockerfiles
Docker Engine регистрирует событие каждый раз, когда демон выполняет какие-либо значительные действия.
Вы можете обратиться к журналу событий, чтобы определить, когда произошло то или иное действие, и отследить изменения объектов с течением времени.
В этой статье мы объясним, что фиксируется как события и как их просмотреть.
Затем мы покажем, как отслеживать события в режиме реального времени с помощью Docker CLI и REST API.
Docker Engine регистрирует событие каждый раз, когда демон выполняет значительные действия.
Вы можете обратиться к журналу событий, чтобы определить, когда произошло то или иное действие, и отследить изменения объектов с течением времени.
В этой статье мы объясним, что фиксируется как события и когда вы можете захотеть их просмотреть.
Затем мы покажем, как отслеживать события в режиме реального времени с помощью Docker CLI и REST API.
Содержание
- Что такое события Docker?
- Передача событий Docker с помощью Docker CLI
- Форматирование вывода
- Фильтрация событий
- Доступ к историческим событиям
- Передача событий Docker из REST API демона
- Отправка событийyf внешнюю службу
- Заключение
Что такое события Docker?
События Docker описывают действия, выполняемые демоном Docker.
Большинство взаимодействий с такими объектами, как контейнеры, образы, тома и сети, записывают событие, создавая журнал, который можно использовать для анализа прошлых изменений.
Существует множество различных видов событий, которые определяют конкретные изменения в вашей среде:
- Создание и удаление контейнеров
- Статусы проверки работоспособности контейнеров
- Команды, выполняемые внутри контейнеров с помощью docker exec
- Пуш и пул образов
- Создание, уничтожение, монтирование и размонтирование томов
- Включение и отключение плагинов демонов Docker.
- Полный список можно посмотреть в документации Docker.
Каждое записанное событие содержит метку времени и идентификатор затронутого объекта.
Вы можете использовать эту информацию для сбора истории изменений в вашей среде, независимо от того, наблюдали ли вы их первоначальные триггеры.
Сохраненные события также могут помочь в диагностике таких проблем, как неожиданные сбои контейнеров.
Просмотр лога позволяет определить точное время остановки контейнера, предоставляя дата поинт, который можно соотнести с другими журналами.
События могут установить, когда проверки контейнера начали давать сбои, сужая период, когда вам нужно проверить внешние службы, чтобы определить основную причину проблемы.
Передача событий Docker с помощью Docker CLI
Команда docker events CLI транслирует события от вашего демона Docker в окно терминала.
События будут появляться в реальном времени до тех пор, пока вы не завершите процесс нажатием комбинации клавиш Ctrl+C.
Выполнение команды без аргументов не покажет никаких результатов.
Отображается только новая активность, поэтому вывод остается пустым до тех пор, пока не произойдет событие.
Вы можете спровоцировать его, запустив новый контейнер в другой оболочке:
docker run --rm hello-world
Теперь в окне терминала, в котором запущена команда docker events, должно появиться несколько событий:
2022-05-31T15:20:00.267970018+01:00 image pull hello-world:latest (name=hello-world)
2022-05-31T15:20:00.347054862+01:00 container create 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
2022-05-31T15:20:00.347805277+01:00 container attach 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
2022-05-31T15:20:00.621070053+01:00 container start 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378 (image=hello-world, name=nifty_morse)
...
Каждое событие отображается в отдельной строке.
Сначала отображается временная метка события, затем тип затронутого объекта (например, образ или контейнер), а затем действие, которое было выполнено (например, создание, присоединение и запуск).
Оставшаяся часть сообщения содержит полезные метаданные об объекте.
Приведенный выше пример показывает, что был извлечен образ hello-world:latest и на его основе создан контейнер.
Форматирование вывода
Необработанный список событий часто бывает громоздким.
Вы можете изменить формат вывода с помощью флага –format, который принимает строку шаблона Go:
docker events --format '{{ .Time }} {{ .Action }} {{ .Type}} {{ .ID }}'
Выполнение этого примера даст результат, который выглядит следующим образом:
1654006800 pull image hello-world:latest
1654006800 create container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 attach container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
1654006800 start container 4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378
Вы можете получать события, представленные в виде объектов JSON, используя {{ json . }} в качестве строки шаблона:
docker events --format '{{ json . }}' | jq
{
"status": "create",
"id": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
"from": "hello-world",
"Type": "container",
"Action": "create",
"Actor": {
"ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
"Attributes": {
"image": "hello-world",
"name": "nifty_morse"
}
},
"scope": "local",
"time": 1654006800,
"timeNano": 1654006800347054800
}
Здесь необработанный JSON передается через jq, так что он будет выведен в терминале.
☠ Как анализировать и вывести JSON с помощью инструментов командной строки Linux
Это облегчает сканирование информации.
В большинстве случаев вам нужно будет писать первую букву каждого свойства с заглавной буквы, например, time – {{ .Time }}.
Фильтрация событий
Журнал событий для загруженного демона Docker может быстро стать шумным.
Вы можете сузить круг событий до определенного действия, объекта или типа объекта с помощью флага –filter:
- docker events –filter type=container – Получить все события, относящиеся к контейнерам.
- docker events –filter event=create – Получить события создания контейнера.
- docker events –filter container=demo-container – Получить все события, сохраненные для контейнера под названием demo-container (можно сослаться на ID или имя контейнера).
Кроме контейнера, вы можете фильтровать по всем поддерживаемым именам типов объектов, таким как образ, сеть и том.
При повторении флага –filter поддерживается несколько фильтров.
Различные фильтры интерпретируются как логические условия AND; несколько применений одного и того же фильтра становятся условиями OR.
Вот пример, в котором событие create используется для контейнеров app-container и api-container:
docker events
--filter container=app-container
--filter container=api-container
--filter event=create
Доступ к историческим событиям
По умолчанию docker events показывает только события, сохраненные с момента выполнения команды.
Вы можете включить исторические события, добавив флаг –since.
Этот флаг принимает человекочитаемое выражение времени или абсолютную временную метку:
docker events --since 1h
docker events --since '2021-05-01T16:00:00'
События, записанные после указанного времени, будут немедленно показаны в вашем терминале.
Новые события будут продолжать отображаться в реальном времени по мере их записи.
Вы можете исключить события после определенного времени с помощью флага –until.
Он работает аналогично –since.
Использование –until отключает потоковую передачу новых событий в реальном времени, поскольку они выходят за пределы запрашиваемого периода времени.
Передача событий Docker из REST API демона
Другой способ доступа к сохраненным событиям – это REST API демона Docker.
Вы можете использовать /events для потоковой передачи событий в реальном времени после включения API на вашем хосте Docker.
События будут возвращены в формате JSON:
curl http://127.0.0.1:2375/v1.41/events
{
"Type": "container",
"Action": "create",
"Actor": {
"ID": "4a6c8d34a183363db5dbfdcc3cab4c82c4a341d719df56ec2e7f879ee8f02378",
"Attributes": {
"image": "hello-world",
"name": "nifty_morse"
}
},
"scope": "local",
"time": 1654006800,
"timeNano": 1654006800347054800
Конечная точка API поддерживает параметры filter, since и until, которые имеют такое же поведение, как и их аналоги в CLI.
Вот как получить все события создания контейнера, записанные за последний час:
curl http://127.0.0.1:2375/v1.41/events?since=1h&filters={'type':'container','action':'create'}
Отправка событийyf внешнюю службу
В Docker отсутствует встроенный способ отправки событий во внешнюю службу.
Это может быть полезно, если вы хотите, чтобы все созданные вами контейнеры регистрировались в существующей платформе мониторинга или аудита.
Вы можете создать собственное решение, создав системную службу, которая постоянно запускает события docker.
Docker должен отправлять каждую новую строку вывода в вашу внешнюю систему.
Сначала напишем скрипт Bash, который реализует необходимую вам функциональность:
!/bin/bash
docker events --format '{{ .Time }} {{ .Action }} {{ .Type }} {{ .ID }}' | while read event
do
curl
-X POST
-H "Content-Type: application/json"
-d '{"event": "$event"}'
https://example.com/events
done
Теперь создайте новый юнит службы systemd по адресу /etc/systemd/system/docker-events.service:
[Unit] Description=Custom Docker Event Monitoring Service [Service] Type=forking ExecStart=/usr/local/bin/docker-events.sh [Install] WantedBy=multi-user.target
Наконец, перезагрузите systemd, чтобы загрузить вашу службу, затем запустите и включите юнит:
$ sudo systemctl daemon-reload $ sudo systemctl start docker-events $ sudo systemctl enable docker-events
Теперь ваша служба будет передавать каждое новое событие на вашу платформу мониторинга.
Включение службы настраивает ее на автоматический запуск при каждой перезагрузке хоста.
Заключение
Cобытия Docker создаются каждый раз, когда демон изменяет объекты в вашей среде.
Потоковая передача лога событий позволяет отслеживать активность демона в режиме реального времени.
Это может помочь вам в отладке проблем, аудите изменений и обеспечении соответствия требованиям.
см. также:
- 🐳 Как запустить несколько контейнеров Docker на разных IP-адресах
- ☸️ Как мониторить логи Kubernetes подов в режиме реального времени с помощью Stern
- 🐳 Как запустить несколько служб в одном контейнере Docker
- 🌐 Как парсить логи WAF ModSecurity?
I was able to build a multiarch image successfully from an M1 Macbook which is arm64.
Here’s my docker file and trying to run from a raspberrypi aarch64/arm64 and I am getting this error when running the image: standard_init_linux.go:228: exec user process caused: exec format error
Editing the post with the python file as well:
FROM frolvlad/alpine-python3
RUN pip3 install docker
RUN mkdir /hoster
WORKDIR /hoster
ADD hoster.py /hoster/
CMD ["python3", "-u", "hoster.py"]
#!/usr/bin/python3
import docker
import argparse
import shutil
import signal
import time
import sys
import os
label_name = "hoster.domains"
enclosing_pattern = "#-----------Docker-Hoster-Domains----------n"
hosts_path = "/tmp/hosts"
hosts = {}
def signal_handler(signal, frame):
global hosts
hosts = {}
update_hosts_file()
sys.exit(0)
def main():
# register the exit signals
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
args = parse_args()
global hosts_path
hosts_path = args.file
dockerClient = docker.APIClient(base_url='unix://%s' % args.socket)
events = dockerClient.events(decode=True)
#get running containers
for c in dockerClient.containers(quiet=True, all=False):
container_id = c["Id"]
container = get_container_data(dockerClient, container_id)
hosts[container_id] = container
update_hosts_file()
#listen for events to keep the hosts file updated
for e in events:
if e["Type"]!="container":
continue
status = e["status"]
if status =="start":
container_id = e["id"]
container = get_container_data(dockerClient, container_id)
hosts[container_id] = container
update_hosts_file()
if status=="stop" or status=="die" or status=="destroy":
container_id = e["id"]
if container_id in hosts:
hosts.pop(container_id)
update_hosts_file()
def get_container_data(dockerClient, container_id):
#extract all the info with the docker api
info = dockerClient.inspect_container(container_id)
container_hostname = info["Config"]["Hostname"]
container_name = info["Name"].strip("/")
container_ip = info["NetworkSettings"]["IPAddress"]
if info["Config"]["Domainname"]:
container_hostname = container_hostname + "." + info["Config"]["Domainname"]
result = []
for values in info["NetworkSettings"]["Networks"].values():
if not values["Aliases"]:
continue
result.append({
"ip": values["IPAddress"] ,
"name": container_name,
"domains": set(values["Aliases"] + [container_name, container_hostname])
})
if container_ip:
result.append({"ip": container_ip, "name": container_name, "domains": [container_name, container_hostname ]})
return result
def update_hosts_file():
if len(hosts)==0:
print("Removing all hosts before exit...")
else:
print("Updating hosts file with:")
for id,addresses in hosts.items():
for addr in addresses:
print("ip: %s domains: %s" % (addr["ip"], addr["domains"]))
#read all the lines of thge original file
lines = []
with open(hosts_path,"r+") as hosts_file:
lines = hosts_file.readlines()
#remove all the lines after the known pattern
for i,line in enumerate(lines):
if line==enclosing_pattern:
lines = lines[:i]
break;
#remove all the trailing newlines on the line list
if lines:
while lines[-1].strip()=="": lines.pop()
#append all the domain lines
if len(hosts)>0:
lines.append("nn"+enclosing_pattern)
for id, addresses in hosts.items():
for addr in addresses:
lines.append("%s %sn"%(addr["ip"]," ".join(addr["domains"])))
lines.append("#-----Do-not-add-hosts-after-this-line-----nn")
#write it on the auxiliar file
aux_file_path = hosts_path+".aux"
with open(aux_file_path,"w") as aux_hosts:
aux_hosts.writelines(lines)
#replace etc/hosts with aux file, making it atomic
shutil.move(aux_file_path, hosts_path)
def parse_args():
parser = argparse.ArgumentParser(description='Synchronize running docker container IPs with host /etc/hosts file.')
parser.add_argument('socket', type=str, nargs="?", default="tmp/docker.sock", help='The docker socket to listen for docker events.')
parser.add_argument('file', type=str, nargs="?", default="/tmp/hosts", help='The /etc/hosts file to sync the containers with.')
return parser.parse_args()
if __name__ == '__main__':
main()