How to use Invoker with docker containers?
Tags: laravel, docker, php, invoker
Published: 2020-07-26 15:07:13

---
title: How to use Invoker with docker containers?
published: true
description: 
tags: laravel, docker, php, invoker
cover_image: https://dev-to-uploads.s3.amazonaws.com/i/c1yttf1ixqapla54wxrt.png
---

**What is Invoker?**
Invoker - is the universal data management tool for laravel/eloquent based applications You can see it features at https://invoker.dev/

It can work with local applications and with remote by ssh connection. But, unfortunately, it hasn't abilities for integration with apps that developed in dockers out of the box, because it distributed as executable gui application. 
So we need to add an ssh service for our docker-compose.

1. If you use separated containers for cli and fpm, you should use cli version as a base for a new ssh container. Otherwise, use your common php container.

2. If you use prepared php image:
 - create new directory, named ssh in you folder with docker config
 - Inside this directory create new Dockerfile
```
FROM {your php image}

USER root
RUN apt-get update && apt-get install -y openssh-server \
    && mkdir /var/run/sshd \
    && echo 'root:secret' | chpasswd \
    && sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config \
    && sed -i 's/#PasswordAuthentication/PasswordAuthentication/' /etc/ssh/sshd_config \
    && sed -i 's/#PermitRootLogin/PermitRootLogin/' /etc/ssh/sshd_config \
    && sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd \
    && apt-get clean \
    &&  rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
```
If you already use Dockerfile for php-cli service, copy it inside created ssh directory, remove CMD, ENTRYPOINT and EXPOSE instructions if it exists, and append ssh instructions above

add record in docker-compose.yml

```
services:
  sshd:
    build:
       context: your_docker_dir/ssh
    restart: on-failure
    ports:
    - '2266:22'
    links:
      - db # dabase service
      - php-cli  #php service
    volumes:
#for docker-compose < 3.x you can use volumes_from
      - data:/app  
    networks:
      - your_network  #if exists
```
Run `docker-compose up -d`, 
Open Invoker, press "Set up SSH connection", and fill

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/1jwu6wpo29jp8y43yaof.png)

Next, you can explore your project models.

If you use docker-compose with version >= 3.4 - you can combine Dokerfile instructions like below

```
FROM php:7.4-cli as php_base #use preferred php image
# Place here your php installation and configuration instructions
FROM php_base AS php_ssh

USER root
RUN apt-get update && apt-get install -y openssh-server \
    && mkdir /var/run/sshd \
    && echo 'root:secret' | chpasswd \
    && sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config \
    && sed -i 's/#PasswordAuthentication/PasswordAuthentication/' /etc/ssh/sshd_config \
    && sed -i 's/#PermitRootLogin/PermitRootLogin/' /etc/ssh/sshd_config \
    && sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd \
    && apt-get clean \
    &&  rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
```

And use it in docker-compose like:
```
services:
  php-cli:
    build:
      context: docker/php
      target: php_base
    restart: on-failure
    links:
      - db
      - redis
    volumes:
      - data:/app
    environment:
      - TZ=${DB_TIMEZONE}
      - PHP_XDEBUG_ENABLED=1
      - XDEBUG_CONFIG=remote_host=host.docker.internal
      - PHP_IDE_CONFIG="serverName=Docker"
    networks:
      - appnet
  sshd:
    build:
       context: docker/php
       target: php_ssh
    restart: on-failure
    ports:
    - '2266:22'
    links:
      - db
      - php-cli
    volumes:
      - data:/app
    networks:
      - appnet
```

Don't forget to take care about keep ssh service only for the local environment!