Docker events init error

Same here.

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.

Содержание

  1. «docker events» not showing service events #101
  2. Comments
  3. Expected behavior
  4. Actual behavior
  5. Steps to reproduce the behavior
  6. docker system events
  7. Usage
  8. Description
  9. Object types
  10. Containers
  11. Images
  12. Plugins
  13. Volumes
  14. Networks
  15. Daemons
  16. Limiting, filtering, and formatting the output
  17. Limit events by time
  18. Filtering (—filter)
  19. Options
  20. Examples
  21. Basic example
  22. Filter events by time
  23. Filter events by criteria
  24. Format the output (—format)
  25. docker events
  26. Usage
  27. Description
  28. Object types
  29. Containers
  30. Images
  31. Plugins
  32. Volumes
  33. Networks
  34. Daemons
  35. Services
  36. Nodes
  37. Secrets
  38. Configs
  39. Limiting, filtering, and formatting the output
  40. Limit events by time (—since, —until)
  41. Filtering (—filter)
  42. Format the output (—format)
  43. Options
  44. Examples
  45. Basic example
  46. Filter events by time
  47. Filter events by criteria
  48. Docker OOM event handling inappropriate #670
  49. Comments
  50. Expected behavior
  51. Actual behavior
  52. 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 photo

    React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo

    Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo

    Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo

    TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo

    Django

    The Web framework for perfectionists with deadlines.

  • Laravel photo

    Laravel

    A PHP framework for web artisans

  • D3 photo

    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 photo

    Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo

    Microsoft

    Open source projects and samples from Microsoft.

  • Google photo

    Google

    Google ❤️ Open Source for everyone.

  • Alibaba photo

    Alibaba

    Alibaba Open Source for everyone

  • D3 photo

    D3

    Data-Driven Documents codes.

  • Tencent photo

    Tencent

    China tencent open source team.

alanlucki

linkott

Error al usar docker Station

mjfreelancing

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.

peterwkc

When i try to run Dockstation, it prompt out this error.

dockstation init error

LiLangShiYe

MajevSong

MiladMohebnia

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 ..

dluigirafael

Screenshot from 2021-05-16 12-41-08
Screenshot from 2021-05-16 12-41-29

My guess is that the command is not passed as a string so bash just runs «docker»

GeorgSteyn

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.

kenculate

Screenshot from 2020-05-14 04-08-58

qq12157138

image

ricardovf

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/)

Screen Shot 2020-03-19 at 6 49 19 PM

Running on OSX Catalina. Docker desktop 2.2.0.4, Compose 1.25.4

TheFehr

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?

juanluisbaptiste

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.

xiamy-summer

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.

aashrai

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.

LenoCode

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

JohnFajardo

Screenshot_2021-04-16_08-50-28

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.

totalchaoslink

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?

MestreLion

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.

Содержание

  1. Что такое события Docker?
  2. Передача событий Docker с помощью Docker CLI
  3. Форматирование вывода
  4. Фильтрация событий
  5. Доступ к историческим событиям
  6. Передача событий Docker из REST API демона
  7. Отправка событийyf внешнюю службу
  8. Заключение

Что такое события 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()

Понравилась статья? Поделить с друзьями:
  • Docker error response from daemon unsupported os linux
  • Docker error response from daemon unknown runtime specified nvidia windows
  • Docker error response from daemon pull access denied for
  • Docker error response from daemon no such container
  • Docker error response from daemon no command specified