【问题标题】:Docker-compose volume doesn't save state of container for KeycloakDocker-compose 卷不保存 Keycloak 的容器状态
【发布时间】:2019-12-11 04:34:49
【问题描述】:

docker-compose.yml

services:
  idprovider-app:
    container_name: idprovider-app
    build:
      dockerfile: Dockerfile
      context: .
    environment:
      KEYCLOAK_USER: admin
      KEYCLOAK_PASSWORD: admin
    volumes:
        - keycloak-data-volume:/var/lib/keycloak/data
    ports:
      - "8090:8090"   
      - "8443:8443"     
volumes:
  keycloak-data-volume:
    external: true

码头文件

FROM jboss/keycloak:7.0.1
EXPOSE 8080
EXPOSE 8443

docker 检查“容器”

"Mounts": [
            {
                "Type": "volume",
                "Name": "keycloak-data-volume",
                "Source": "/mnt/sda1/var/lib/docker/volumes/keycloak-data-volume/_data",
                "Destination": "/var/lib/keycloak/data",
                "Driver": "local",
                "Mode": "rw",
                "RW": true,
                "Propagation": ""
            }
        ],

docker volume inspect keycloak-data-volume

[
    {
        "CreatedAt": "2019-12-10T19:31:55Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/mnt/sda1/var/lib/docker/volumes/keycloak-data-volume/_data",
        "Name": "keycloak-data-volume",
        "Options": {},
        "Scope": "local"
    }
]

没有错误,但不保存状态。我不知道出了什么问题。我在 Windows 10 上运行它。

【问题讨论】:

    标签: docker docker-compose dockerfile keycloak docker-volume


    【解决方案1】:

    使用默认数据库位置,您可以使用 docker-compose 尝试此选项:

    keycloak:
        image: quay.io/keycloak/keycloak:14.0.0
        container_name: keycloak
        environment:
          KEYCLOAK_USER: admin
          KEYCLOAK_PASSWORD: admin
        ports:
          - "8082:8080"
        restart: always
        volumes:
          - .local/keycloak/:/opt/jboss/keycloak/standalone/data/
    

    找到与普通 docker https://stackoverflow.com/a/60554189/6916890 类似的答案

    docker run --volume /root/keycloak/data/:/opt/jboss/keycloak/standalone/data/

    【讨论】:

      【解决方案2】:

      您使用的是哪个数据库?我认为您还需要将数据库卷与其绑定以保存状态。

      例如:用于postgress

      services:
        postgres:
            image: postgres
            volumes:
              - postgres_data:/var/lib/postgresql/data
            environment:
              POSTGRES_DB: keycloak
              POSTGRES_USER: keycloak
              POSTGRES_PASSWORD: password
      

      或者对于mysql

      services:
        mysql:
            image: mysql:5.7
            volumes:
              - mysql_data:/var/lib/mysql
            environment:
              MYSQL_ROOT_PASSWORD: root
              MYSQL_DATABASE: keycloak
              MYSQL_USER: keycloak
              MYSQL_PASSWORD: password
      

      【讨论】:

      • postgres 是否需要另外使用一项服务?我可以在 idprovider-app 中运行 postgres 吗?对于独立的keycloak,我可以在standalone.xml中设置配置以使用postgres,我可以在docker中做类似的事情吗?
      • 对不起,我对 Keycloak 及其配置不是很熟悉。我指出这些是因为我认为状态保存在 db 中,这就是我建议映射 db 卷的原因。也在他们的github repo。他们在提到它。
      【解决方案3】:

      您必须在环境变量中指定数据库的来源。 如果您为 postgres 的 PostgreSQL 实例使用不同的服务,则必须在您的服务中指定 DB_ADDR 环境变量。

      services:
        idprovider-app:
          container_name: idprovider-app
          build:
            dockerfile: Dockerfile
            context: .
          environment:
            DB_VENDOR: POSTGRES
            # Specify hostname of the database (eg: hostname or hostname:port)
            DB_ADDR: hostname:5432 
            DB_DATABASE: keycloak
            DB_USER: keycloak
            DB_SCHEMA: public
            DB_PASSWORD: password
            KEYCLOAK_USER: admin
            KEYCLOAK_PASSWORD: admin
          volumes:
              - keycloak-data-volume:/var/lib/keycloak/data
          ports:
            - "8090:8090"   
            - "8443:8443"     
      volumes:
        keycloak-data-volume:
          external: true
      

      【讨论】:

      • 我认为这个例子是不完整的。
      猜你喜欢
      • 1970-01-01
      • 2020-07-15
      • 2019-09-04
      • 2017-03-22
      • 1970-01-01
      • 2018-01-20
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多