DockerFile in ./docker/8.0 vs DockerFile in ./vendor/laravel/sail/runtimes/8.0

Viewed 235

Good day,

I got stumbled to a peculiar issue. I'm a newbie in Laravel Sail with Docker. When I change the laravel service context to point to DockerFile in ./docker/8.0 which I used to add some scripts to install PHP SQL server drivers and ODBC the container wont start instead it gives message /usr/bin/env: 'bash\r': No such file or directory ;

version: '3'
services:
    laravel.test:
        build:
            context: ./docker/8.0
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.0/app
        container_name: oncampus-webapp
        ports:
            - '${APP_PORT:-80}:80'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
        volumes:
            - '.:/var/www/html'
        networks:
            - sail

The same scripts for PHP SQL server driver and ODBC when I add them to the DockerFile in ./vendor/laravel/sail/runtimes/8.0 and change the context of the laravel service in docker-compose.yml the container starts successfully.

version: '3'
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.0 # Default context
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.0/app
        container_name: oncampus-webapp
        ports:
            - '${APP_PORT:-80}:80'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
        volumes:
            - '.:/var/www/html'
        networks:
            - sail

Here is my DockerFile which has the additional PHP SQL drivers and ODBC installation instructions

    FROM ubuntu:20.04
    
    LABEL maintainer="Taylor Otwell"
    
    ARG WWWGROUP
    
    WORKDIR /var/www/html
    
    ENV DEBIAN_FRONTEND noninteractive
    ENV TZ=UTC
    
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    
    RUN apt-get update \
        && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin libpng-dev python2 \
        && mkdir -p ~/.gnupg \
        && chmod 600 ~/.gnupg \
        && echo "disable-ipv6" >> ~/.gnupg/dirmngr.conf \
        && apt-key adv --homedir ~/.gnupg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys E5267A6C \
        && apt-key adv --homedir ~/.gnupg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C300EE8C \
        && echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu focal main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
        && apt-get update \
        && apt-get install -y php8.0-cli php8.0-dev \
           php8.0-pgsql php8.0-sqlite3 php8.0-gd \
           php8.0-curl php8.0-memcached \
           php8.0-imap php8.0-mysql php8.0-mbstring \
           php8.0-xml php8.0-zip php8.0-bcmath php8.0-soap \
           php8.0-intl php8.0-readline \
           php8.0-msgpack php8.0-igbinary php8.0-ldap \
           php8.0-redis \
        && php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer \
        && curl -sL https://deb.nodesource.com/setup_16.x | bash - \
        && apt-get install -y nodejs \
        && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
        && echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list \
        && apt-get update \
        && apt-get install -y yarn \
        && apt-get install -y mysql-client \
        && apt-get install -y postgresql-client \
        && apt-get -y autoremove \
        && apt-get clean \
        && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
    
    RUN pecl channel-update https://pecl.php.net/channel.xml \
        && pecl install swoole \
        && pecl clear-cache \
        && rm -rf /tmp/* /var/tmp/*
    
    RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.0
    
    # Start of PHP SQL Server Driver Entries
    # Add repository ODBC and Install the Microsoft ODBC driver for SQL Server
    RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
        # Ubuntu 20.04
        && curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list > /etc/apt/sources.list.d/mssql-release.list \
        && apt-get update \
        && ACCEPT_EULA=Y apt-get install -y msodbcsql17 \
        # optional: for bcp and sqlcmd
        && ACCEPT_EULA=Y apt-get install -y mssql-tools \
        && apt-get install -y gcc musl-dev make \
        # optional: for unixODBC development headers (The Microsoft ODBC driver’s installation page mentions that the development libraries are optional – they are not. So run the command below to avoid errors)
        && apt-get install -y unixodbc-dev
    
    # Install the PHP drivers for Microsoft SQL Server
    RUN apt-get update \
        && pecl channel-update pecl.php.net \
        #&& pecl channel-update https://pecl.php.net/channel.xml \
        #&& pecl install swoole \
        && pecl install sqlsrv pdo_sqlsrv \
        && pecl clear-cache \
        && rm -rf /tmp/* /var/tmp/*
    
    RUN /bin/bash -c 'source ~/.bashrc'
    RUN echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
    
    RUN printf "; priority=20\nextension=sqlsrv.so\n" > /etc/php/8.0/mods-available/sqlsrv.ini
    RUN printf "; priority=30\nextension=pdo_sqlsrv.so\n" > /etc/php/8.0/mods-available/pdo_sqlsrv.ini
    RUN phpenmod sqlsrv pdo_sqlsrv
    # End of PHP SQL Server Driver Entries
    
    RUN groupadd --force -g $WWWGROUP sail
    RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail
    
    COPY start-container /usr/local/bin/start-container
    COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
    COPY php.ini /etc/php/8.0/cli/conf.d/99-sail.ini
    RUN chmod +x /usr/local/bin/start-container
    
    EXPOSE 8000
    
    ENTRYPOINT ["start-container"]

And the start-container script

#!/usr/bin/env bash

if [ ! -z "$WWWUSER" ]; then
    usermod -u $WWWUSER sail
fi

if [ ! -d /.composer ]; then
    mkdir /.composer
fi

chmod -R ugo+rw /.composer

if [ $# -gt 0 ];then
    exec gosu $WWWUSER "$@"
else
    /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
fi

I'm running docker desktop on Microsoft Windows Platform with WSL2 using Ubuntu distro.

I would appreciate for anyone to assist where am I missing a point between the two files.

Thanks in advance

1 Answers

I faced the same issue recently. I'm running Sail from Macos, and after running artisan sail:publish and made some tweaks for getting xdebug running as expected, it were working fine so I committed my changes. I switched to another branch and after that, I switched back and suddenly that error start to appear.

In my case was related with a Git misconfiguration for line endings formats. So this is what I did:

1.- I installed dos2unix command line program for passing those files that I changed to the right format.

#Mac OS
$ brew install dos2unix
$ find docker/ -type f -exec dos2unix {} ;
$ dos2unix docker-compose.yml

2.- Remove previous images and containers with docker desktop.

3.- Run sail up again

4.- Change my git config (input for Unix based systems, true for Windows):

$ git config --global core.autocrlf input

Hope it can help anyone else.

Related