Например:
$ sudo -i
# groupadd -r slapd-dcm4chee --gid=1021 && useradd -r -g slapd-dcm4chee --uid=1021 slapd-dcm4chee
# groupadd -r postgres-dcm4chee --gid=999 && useradd -r -g postgres-dcm4chee --uid=999 postgres-dcm4chee
# groupadd -r dcm4chee-arc --gid=1023 && useradd -r -g dcm4chee-arc --uid=1023 dcm4chee-arc
# exit
В противном случае в выведенной информации о каталогах и файлах, созданных контейнерами в bind-mounted каталогах хоста, в качестве сведений о владельце будут отображаться числовые ID пользователя и группы. Например:
$ sudo ls -l /var/local/dcm4chee-arc/wildfly/
total 20
-rw-r--r-- 1 1023 1023 0 Sep 3 22:34 chown.done
drwxr-sr-x 4 1023 1023 4096 Sep 3 22:34 configuration
drwxr-sr-x 9 1023 1023 4096 Sep 3 22:34 data
drwxr-sr-x 2 1023 1023 4096 Sep 3 22:34 deployments
drwxr-sr-x 2 1023 1023 4096 Sep 3 22:34 log
drwxr-sr-x 5 1023 1023 4096 Sep 4 00:53 tmp
Далее используйте Docker Command Line либо как альтернативу — Docker Compose:
$ docker network create dcm4chee_network
Запустите контейнер, предоставляющий LDAP-сервер, в созданной сети, например:
$ docker run --network=dcm4chee_network --name ldap \
-p 389:389 \
-v /var/local/dcm4chee-arc/ldap:/var/lib/openldap/openldap-data \
-v /var/local/dcm4chee-arc/slapd.d:/etc/openldap/slapd.d \
-d dcm4che/slapd-dcm4chee:2.6.10-34.3
Публикация порта ldap 389 из контейнера на хосте через -p 389:389 обеспечивает доступ к LDAP-серверу
также для внешних LDAP-клиентов, например Apache LDAP Directory Studio.
Для работы Архива это не требуется, поскольку контейнер Архива подключается к порту LDAP сервера LDAP-контейнера
через созданную сеть bridge.
Bind mount -v /var/local/dcm4chee-arc/ldap:/var/lib/openldap/openldap-data и -v /var/local/dcm4chee-arc/slapd.d:/etc/openldap/slapd.d
обеспечивают хранение базы данных LDAP и конфигурации сервера OpenLDAP в указанных каталогах хоста. Они
инициализируются при первом запуске контейнера, если они ещё не присутствуют в указанных каталогах хоста.
Это гарантирует, что изменения в конфигурации Архива не будут потеряны при удалении и повторном создании
контейнера сервера OpenLDAP.
Инициализированные данные LDAP и конфигурацию сервера OpenLDAP можно настроить с помощью
переменных окружения.
Например:
-e LDAP_BASE_DN=dc=ihe,dc=net \
-e LDAP_ROOTPASS=mypass \
-e ARCHIVE_DEVICE_NAME=central-archive \
-e AE_TITLE=CENTRAL \
-e DICOM_PORT=10104 \
-e HL7_PORT=12575
-e STORAGE_DIR=/storage/fs1
будет использовать
- dc=ihe,dc=net (по умолчанию: dc=dcm4che,dc=org) в качестве суффикса базы данных (или base DN) каталога LDAP,
- mypass (по умолчанию: secret) в качестве пароля root для доступа к каталогу LDAP,
- central-archive (по умолчанию: dcm4chee-arc) в качестве Device Name Архива,
- CENTRAL (по умолчанию: DCM4CHEE) в качестве основного Application Entity Title Архива,
- 10104 (по умолчанию: 11112) в качестве порта прослушивания для DICOM-соединений с Архивом,
- 12575 (по умолчанию: 2575) в качестве порта прослушивания для HL7-приёмника Архива,
- /storage/fs1 (по умолчанию: /opt/wildfly/standalone/data/fs1) в качестве пути к каталогу — внутри
контейнера Архива — где Архив хранит полученные DICOM-объекты.
Запустите контейнер, предоставляющий сервер базы данных, в созданной сети, например:
$ docker run --network=dcm4chee_network --name db \
-p 5432:5432 \
-e POSTGRES_DB=pacsdb \
-e POSTGRES_USER=pacs \
-e POSTGRES_PASSWORD=pacs \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-v /var/local/dcm4chee-arc/db:/var/lib/postgresql/data \
-d dcm4che/postgres-dcm4chee:17.4-34
Публикация порта сервера PostgreSQL 5432 из контейнера на хосте через -p 5432:5432 обеспечивает доступ к
серверу PostgreSQL также для внешних PostgreSQL-клиентов. Для работы Архива это не требуется, поскольку
контейнер Архива подключается к порту сервера PostgreSQL-контейнера через созданную сеть bridge.
-e POSTGRES_DB=pacsdb \
-e POSTGRES_USER=pacs \
-e POSTGRES_PASSWORD=pacs \
задают имя базы данных, пользователя и его пароль.
См. остальные доступные переменные окружения контейнера PostgreSQL.
Bind mount -v /etc/localtime:/etc/localtime:ro и -v /etc/timezone:/etc/timezone:ro дублирует
часовой пояс вашего хоста внутри контейнера. В противном случае часовым поясом контейнера является UTC.
Внимание: Если на вашем хосте нет файла /etc/timezone, вам необходимо создать его
(например: $ echo "Europe/Vienna" > /etc/timezone) перед запуском контейнера, иначе контейнер не запустится.
Bind mount -v /var/local/dcm4chee-arc/db:/var/lib/postgresql/data обеспечивает хранение базы данных в
указанном каталоге хоста. Она инициализируется при первом запуске контейнера, если она ещё не присутствует
в указанном каталоге хоста. Это гарантирует, что данные не будут потеряны при удалении и повторном создании
контейнера сервера PostgreSQL.
Запустите контейнер, предоставляющий Wildfly с развёрнутым приложением dcm4che Archive 5, в созданной сети, например:
$ docker run --network=dcm4chee_network --name arc \
-p 8080:8080 \
-p 8443:8443 \
-p 9990:9990 \
-p 9993:9993 \
-p 11112:11112 \
-p 2762:2762 \
-p 2575:2575 \
-p 12575:12575 \
-e POSTGRES_DB=pacsdb \
-e POSTGRES_USER=pacs \
-e POSTGRES_PASSWORD=pacs \
-e WILDFLY_WAIT_FOR="ldap:389 db:5432" \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-v /var/local/dcm4chee-arc/wildfly:/opt/wildfly/standalone \
-d dcm4che/dcm4chee-arc-psql:5.34.3
-p 8080:8080 \
-p 8443:8443 \
-p 9990:9990 \
-p 9993:9993 \
-p 11112:11112 \
-p 2762:2762 \
-p 2575:2575 \
-p 12575:12575 \
публикует http-порт (8080) и https-порт (8443) веб-сервера, http-порт (9990) и https-порт (9993)
консоли администрирования WildFly, а также DICOM-порт (11112), DICOM TLS-порт (2762), HL7-порт (2575)
и HL7 TLS-порт (12575) приложения Архива из контейнера на хост, чтобы внешние http(s)-клиенты,
DICOM-приложения и HL7-отправители могли подключаться к WildFly и приложению Архива.
Переменные окружения:
-e POSTGRES_DB=pacsdb \
-e POSTGRES_USER=pacs \
-e POSTGRES_PASSWORD=pacs \
задают имя базы данных, пользователя и пароль для подключения к серверу PostgreSQL, которые должны совпадать
со значениями, заданными для контейнера сервера PostgreSQL. В противном случае приложение Архива не сможет
подключиться к серверу PostgreSQL.
Если вы задали переменные окружения LDAP_BASE_DN, LDAP_ROOTPASS или ARCHIVE_DEVICE_NAME для контейнера
LDAP-сервера, вам необходимо задать эти переменные окружения и для контейнера Архива. В противном случае
приложение Архива не сможет подключиться к серверу LDAP или не найдёт свою конфигурацию в каталоге LDAP.
-e WILDFLY_WAIT_FOR="ldap:389 db:5432" задерживает запуск WildFly до тех пор, пока OpenLDAP slapd и сервер
PostgreSQL не начнут прослушивать указанные порты, что предотвращает ошибки при перезапуске всех контейнеров,
вызванные ошибками подключения приложения Архива к LDAP и PostgreSQL до того, как OpenLDAP slapd и PostgreSQL
будут готовы принимать соединения.
Bind mount -v /etc/localtime:/etc/localtime:ro и -v /etc/timezone:/etc/timezone:ro дублирует
часовой пояс вашего хоста внутри контейнера. В противном случае часовым поясом контейнера является UTC.
Внимание: Если на вашем хосте нет файла /etc/timezone, вам необходимо создать его
(например: $ echo "Europe/Vienna" > /etc/timezone) перед запуском контейнера, иначе контейнер не запустится.
Bind mount -v /var/local/dcm4chee-arc/wildfly:/opt/wildfly/standalone обеспечивает хранение конфигурации
сервера Wildfly в указанном каталоге хоста. Она инициализируется при первом запуске контейнера, если она ещё
не присутствует в указанном каталоге хоста. Это гарантирует, что данные не будут потеряны при удалении и
повторном создании контейнера сервера Архива.
Если вы задали переменную окружения STORAGE_DIR для контейнера LDAP-сервера, которая указывает путь к
каталогу, где Архив хранит полученные DICOM-объекты, вам также следует выполнить bind mount этого каталога
в каталог хоста, чтобы гарантировать, что сохранённые DICOM-объекты не будут потеряны при удалении и
повторном создании контейнера сервера Архива. Например, если STORAGE_DIR=/storage/fs1, вы можете
использовать bind mount -v /var/local/dcm4chee-arc/storage:/storage.
Вам также необходимо убедиться, что системный пользователь, под которым в контейнере Архива запускается
WildFly, имеет право на запись в этот каталог, либо создав каталог и изменив его владельца на этого
системного пользователя:
```
$ sudo -i
``
либо добавив к значению по умолчанию переменной окруженияWILDFLY_CHOWN=/opt/wildfly/standaloneпуть к
каталогу, подключённому через bind mount (например,WILDFLY_CHOWN="/opt/wildfly/standalone /storage"`).
Значение по умолчанию STORAGE_DIR=/opt/wildfly/standalone/data/fs1 контейнера LDAP задаёт подкаталог
каталога /opt/wildfly/standalone и поэтому уже отображён из контейнера в каталог хоста через
-v /var/local/dcm4chee-arc/wildfly:/opt/wildfly/standalone.
По умолчанию https-сервисы будут использовать сертификат
для обработки TLS-соединений. Чтобы избежать предупреждения системы безопасности в веб-браузерах,
обращающихся к UI Архива или консоли администрирования WildFly, вам необходимо предоставить сертификат,
Common Name и/или Subject Alt Name которого соответствует имени хоста и который подписан доверенным
издателем, в файле хранилища ключей в формате PKCS #12
или Java KeyStore (JKS),
выполнить bind mount файла или содержащего его каталога в контейнер и указать его через переменную окружения
KEYSTORE.
См. остальные доступные переменные окружения контейнера Архива.
Проверьте журнал сервера Wildfly, чтобы убедиться, что Архив успешно запустился:
console
$ tail -f /var/local/dcm4chee-arc/wildfly/log/server.log
2022-06-09 14:03:58,946 INFO [org.dcm4che3.net.Connection] (EE-ManagedExecutorService-default-Thread-2) Start TCP Listener on /0.0.0.0:11112
2022-06-09 14:03:58,946 INFO [org.dcm4che3.net.Connection] (EE-ManagedExecutorService-default-Thread-1) Start TCP Listener on /0.0.0.0:2575
2022-06-09 14:03:59,048 INFO [org.dcm4che3.net.Connection] (EE-ManagedExecutorService-default-Thread-3) Start TCP Listener on /0.0.0.0:12575
2022-06-09 14:03:59,048 INFO [org.dcm4che3.net.Connection] (EE-ManagedExecutorService-default-Thread-4) Start TCP Listener on /0.0.0.0:2762
2022-06-09 14:03:59,211 INFO [org.jboss.as.server] (ServerService Thread Pool -- 46) WFLYSRV0010: Deployed "dcm4chee-arc-ui2-5.34.3-secure.war" (runtime-name : "dcm4chee-arc-ui2-5.34.3-secure.war")
2022-06-09 14:03:59,211 INFO [org.jboss.as.server] (ServerService Thread Pool -- 46) WFLYSRV0010: Deployed "dcm4chee-arc-ear-5.34.3-psql-secure.ear" (runtime-name : "dcm4chee-arc-ear-5.34.3-psql-secure.ear")
2022-06-09 14:03:59,238 INFO [org.jboss.as.server] (Controller Boot Thread) WFLYSRV0212: Resuming server
2022-06-09 14:03:59,246 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 27.0.1.Final (WildFly Core 18.1.1.Final) started in 10685ms - Started 2819 of 3031 services (446 services are lazy, passive or on-demand) - Server configuration file in use: dcm4chee-arc-oidc.xml
2022-06-09 14:03:59,248 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0062: Http management interface listening on http://0.0.0.0:9990/management and https://0.0.0.0:9993/management
2022-06-09 14:03:59,248 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0053: Admin console listening on http://0.0.0.0:9990 and https://0.0.0.0:9993
console
$ docker run --rm --network=dcm4chee_network dcm4che/dcm4che-tools storescu -cDCM4CHEE@arc:11112 /opt/dcm4che/etc/testdata/dicom
Scanning files to send
................
Scanned 16 files in 0.053s (=3ms/file)
17:20:53,552 INFO - Initiate connection from 0.0.0.0/0.0.0.0:0 to 192.168.2.131:11112
17:20:53,560 INFO - Established connection Socket[addr=/192.168.2.131,port=11112,localport=59369]
17:20:53,570 DEBUG - /172.18.0.2:59369->/192.168.2.131:11112(1): enter state: Sta4 - Awaiting transport connection opening to complete
17:20:53,571 INFO - STORESCU->DCM4CHEE(1) << A-ASSOCIATE-RQ
:
17:20:54,657 INFO - STORESCU->DCM4CHEE(1) >> A-RELEASE-RP
17:20:54,657 INFO - STORESCU->DCM4CHEE(1): close Socket[addr=/192.168.2.131,port=11112,localport=59369]
17:20:54,657 DEBUG - STORESCU->DCM4CHEE(1): enter state: Sta1 - Idle
Sent 16 objects (=2.027MB) in 1.06s (=1.912MB/s)
Полученные изображения должны появиться в UI Архива по адресу http://localhost:8080/dcm4chee-arc/ui2 или
https://localhost:8443/dcm4chee-arc/ui2:

$ docker stop ldap db arc
и снова запустить все 3 контейнера командой:
$ docker start ldap db arc
```
$ docker rm -v ldap db arc
```
Вы можете удалить созданную сеть bridge командой
$ docker network rm dcm4chee_network
В качестве альтернативы Docker Command Line можно использовать Docker Compose, который позаботится о запуске всех 3 контейнеров:
docker-compose.yml (например):yaml
version: "3"
services:
ldap:
image: dcm4che/slapd-dcm4chee:2.6.10-34.3
logging:
driver: json-file
options:
max-size: "10m"
ports:
- "389:389"
environment:
STORAGE_DIR: /storage/fs1
volumes:
- /var/local/dcm4chee-arc/ldap:/var/lib/openldap/openldap-data
- /var/local/dcm4chee-arc/slapd.d:/etc/openldap/slapd.d
db:
image: dcm4che/postgres-dcm4chee:17.4-34
logging:
driver: json-file
options:
max-size: "10m"
ports:
- "5432:5432"
environment:
POSTGRES_DB: pacsdb
POSTGRES_USER: pacs
POSTGRES_PASSWORD: pacs
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- /var/local/dcm4chee-arc/db:/var/lib/postgresql/data
arc:
image: dcm4che/dcm4chee-arc-psql:5.34.3
logging:
driver: json-file
options:
max-size: "10m"
ports:
- "8080:8080"
- "8443:8443"
- "9990:9990"
- "9993:9993"
- "11112:11112"
- "2762:2762"
- "2575:2575"
- "12575:12575"
environment:
POSTGRES_DB: pacsdb
POSTGRES_USER: pacs
POSTGRES_PASSWORD: pacs
WILDFLY_CHOWN: /storage
WILDFLY_WAIT_FOR: ldap:389 db:5432
depends_on:
- ldap
- db
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- /var/local/dcm4chee-arc/wildfly:/opt/wildfly/standalone
- /var/local/dcm4chee-arc/storage:/storage
См. доступные переменные окружения для - контейнера Slapd - контейнера PostgreSQL - контейнера Архива
Примечание: Если возникают трудности с запуском сервиса Архива из-за сообщения
````
There is insufficient memory for the Java Runtime Environment to continue. Cannot create GC thread. Out of system resources.
````
добавьте следующую опцию к сервису `arc`
````
security_opt:
- seccomp:unconfined
````
console
$ docker-compose -p dcm4chee up -d
Creating network "dcm4chee_network" with the default driver
Creating dcm4chee_ldap_1 ...
Creating dcm4chee_db_1 ...
Creating dcm4chee_ldap_1
Creating dcm4chee_db_1 ... done
Creating dcm4chee_arc_1 ...
Creating dcm4chee_arc_1 ... done
в каталоге, содержащем docker-compose.yml.
console
$ docker-compose -p dcm4chee stop
Stopping dcm4chee_arc_1 ... done
Stopping dcm4chee_db_1 ... done
Stopping dcm4chee_ldap_1 ... done
и снова запустить все 3 контейнера командой:
console
$ docker-compose -p dcm4chee start
Starting db ... done
Starting ldap ... done
Starting arc ... done
```console
$ docker-compose -p dcm4chee down
Stopping dcm4chee_arc_1 ... done
Stopping dcm4chee_db_1 ... done
Stopping dcm4chee_ldap_1 ... done
Removing dcm4chee_arc_1 ... done
Removing dcm4chee_db_1 ... done
Removing dcm4chee_ldap_1 ... done
Removing network dcm4chee_network
```