Por lo que he recopilado, la razón general de esto se debe a los permisos de SELinux. Cuando crea hosts virtuales, SELinux espera que cree tipos de SELinux para cada host virtual para que cada host no pueda pisotear o leer archivos de otro host, lo cual tiene sentido.
Si tiene policycoreutils
instalado, puede usar audit2why
para echar un vistazo a lo que se le niega el acceso y, a menudo, sugiere formas de remediar esto (no siempre es la mejor manera de arreglar el problema, pero a menudo lo más rápido sin simplemente deshabilitar SELinux ).
Por ejemplo, para ver todos los accesos denegados en el registro de auditoría:audit2why <<< "$(
Lo más probable es que veas algo como:
type=AVC msg=audit(1528554604.842:403): avc: denied { append } for pid=34797 comm="httpd" name="error.log" dev="sda2" ino=51161328 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=file
Was caused by:
The boolean httpd_unified was set incorrectly.
Description:
Allow httpd to unified
Allow access by executing:
# setsebool -P httpd_unified 1
En este caso, habilitar httpd_unified
permite que httpd se inicie correctamente de nuevo, ya que permite que todos los hosts virtuales compartan el contexto de tipo, que es menos seguro, pero nuevamente es mejor que apagar SELinux.
Ver:https://www.redhat.com/archives/fedora-selinux-list/2009-March/msg00070.html
Вы должны использовать файл .env
, в котором вы поместите свои глобальные окружения для чтения с помощью компоновки.
См.:https://docs.docker.com/compose/environment-variables/#the-env-fileдля получения дополнительной информации об использовании файла.
Другим возможным решением может быть template.yml
файл, вызываемый с помощью docker-compose
, например.:
template.yml
, который является вашим docker-compose.yml
с переменной окружения. env.sh
' source env.sh; rm -rf docker-compose.yml; envsubst < "template.yml" > "docker-compose.yml";
Будет создан новый файл docker-compose.yml
с правильными значениями переменных среды.
Пример файла template.yml:
SampleContainer:
image: myImage:latest
container_name: sample
depends_on:
- mysql-server
restart: always
volumes:
- /opt/docker/myapplication/bootstrap.properties:/opt/myserver/${SERVER_NAME}/bootstrap.properties
Образец env.sh
файла:
#!/bin/bash
export SERVER_NAME=jingool
Другие варианты включают:
docker-compose
В версии 1.5+ включена подстановка переменных:https://github.com/docker/compose/releases
Последняя версия Docker Compose позволяет получить доступ к переменным среды из файла компоновки. Таким образом, вы можете получить свои переменные среды, а затем запустить Compose следующим образом:
set -a
source.my-env
docker-compose up -d
Затем вы можете ссылаться на переменные в docker-compose.yml
с помощью ${VARIABLE}
, например:
/opt/docker/myapplication/bootstrap.properties:/opt/myserver/${SERVER_NAME}/bootstrap.properties
А вот еще информация из документации, взятой здесь:https://docs.docker.com/compose/compose-file/#variable-substitution
Способ BASH:
Вот более гибкий метод с использованием скрипта bash и файла .env
.
Пример .env
файла:
EXAMPLE_URL=http://example.com
# Note that the variable below is commented out and will not be used:
# EXAMPLE_URL=http://example2.com
SECRET_KEY=ABDFWEDFSADFWWEFSFSDFM
# You can even define the compose file in an env variable like so:
COMPOSE_CONFIG=my-compose-file.yml
# You can define other compose files, and just comment them out
# when not needed:
# COMPOSE_CONFIG=another-compose-file.yml
затем запустите этот скрипт bash в том же каталоге,который должен правильно развернуть все:
#!/bin/bash
docker rm -f `docker ps -aq -f name=myproject_*`
set -a
source.env
cat ${COMPOSE_CONFIG} | envsubst | docker-compose -f - -p "myproject" up -d
Тут тоже интересно почитать:https://modulitos.com/2016/03/lets-deploy-part-1/