Set Laravel version using SAIL - laravel

I am using this script to create a new Laravel project:
https://laravel.build/example
However, Laravel 9.* is installed by default.
How do I change the script to install Laravel 8 ?
I tried inserting versions these three places: "laravel new 'version'", "laravel new example 'version'" and "laravelsail/php81-composer:'version'"

You can modify the script replacing the
laravel new example-app
by the command from #Yug
composer create-project laravel/laravel example-app 8.0
installing laravel/sail:
composer require laravel/sail
and change docker image to
laravelsail/php74-composer
In the end the final script will be like:
docker info > /dev/null 2>&1
# Ensure that Docker is running...
if [ $? -ne 0 ]; then
echo "Docker is not running."
exit 1
fi
docker run --rm \
-v "$(pwd)":/opt \
-w /opt \
laravelsail/php74-composer:latest \
bash -c "composer create-project laravel/laravel example-app 8.0 && cd example-app && composer require laravel/sail && php ./artisan sail:install --with=mysql,redis,meilisearch,mailhog,selenium "
cd example-app
CYAN='\033[0;36m'
LIGHT_CYAN='\033[1;36m'
WHITE='\033[1;37m'
NC='\033[0m'
echo ""
if sudo -n true 2>/dev/null; then
sudo chown -R $USER: .
echo -e "${WHITE}Get started with:${NC} cd example-app && ./vendor/bin/sail up"
else
echo -e "${WHITE}Please provide your password so we can make some final adjustments to your application's permissions.${NC}"
echo ""
sudo chown -R $USER: .
echo ""
echo -e "${WHITE}Thank you! We hope you build something incredible. Dive in with:${NC} cd example-app && ./vendor/bin/sail up"
fi

Run this command to install an old version of Laravel
composer create-project laravel/laravel name_projet 8.0
composer self-update
composer update --no-scripts

Related

how to run php artisan optimize:clear on laravel dockerized app via kubernetes

I'm using Kubernetes on Digitalocean cloud platform
the deckorized laravel app is running right now
and i need to run php artisan optimize:clear to all pods which are loading the app
how can i do that?
Edit:
I got the solution
First step connect to pod container
kubectl exec -it pod_name -- /bin/bash
then
php artisan optimize:clear
or
kubectl exec -it pod_name -- /bin/bash -c "php artisan route:clear"
You can build a bash file like the below:
#!/bin/bash
PODS=$(kubectl get pods -n my-production | grep php-fpm | awk -F' *|/' '$2 == $3 && $4 == "Running"' | awk {'print $1'} | column -t )
for POD in $PODS
do
echo $POD
kubectl -n my-production exec $POD -c php -- php artisan optimize:clear
done
echo "Done!"

Shell scripts stops writing in log file

I am working on a provisioner shell script which after certain tasks writes in a log file. The problem is that after the third write operation it stops and doesn't log anything else, however the script runs successfully with the rest of the operations.
I am using this most simple command:
#!/bin/bash
set -o nounset
set -o errexit
# Set variables
APACHE_USER="www-data"
STORES_PATH="/var/www/x/stores"
LOG_FILE="deploy_store.log"
NEW_DB_PWD="$(openssl rand -base64 12)"
arg1="${1:-}"
echo "'$arg1' provision started on $(date +'%Y-%m-%d %H:%M')" >> "${LOG_FILE}"
git clone git#bitbucket.org:x/y.git ${STORES_PATH}"/$arg1"
echo "Done cloning the repository." >> "${LOG_FILE}"
# Link the store vendor folder
ln -s /srv/x/vendor_5.7 ${STORES_PATH}"/$arg1/vendor"
echo "Done linking the vendor folder." >> "${LOG_FILE}"
# Run the setup composer commands
cd ${STORES_PATH}"/$arg1" && composer dump-autoload
cd ${STORES_PATH}"/$arg1" && php artisan package:discover --ansi
cd ${STORES_PATH}"/$arg1" && php -r "file_exists('.env') || copy('.env.example', '.env');"
cd ${STORES_PATH}"/$arg1" && php artisan key:generate
echo "Done composer setup." >> "${LOG_FILE}" # THIS IS NOT LOGGED.

Init Laravel passport from within docker

I'm in the process of dockerizing our dev environement. The application consists among other things of a laravel app exposing a REST API. Authentication is done through laravel passport.
As this is intented for dev only, I'm installing composer dependencies, setting application encryption key, migrating datatabases and setting passport keys at run time. Everything is initialised correctly except for the passport keys. No matter how I tried to approach the problem I end up with the following error:
fpm_1 | In CryptKey.php line 45:
fpm_1 |
fpm_1 | Key path "file:///var/www/html/storage/oauth-public.key" does not exist or
fpm_1 | is not readable
This is the relevant part of my docker-compose file.
version: '3'
services:
fpm:
build: ./api/docker/fpm
restart: unless-stopped
volumes:
- ./api:/var/www/html
- /etc/passwd:/etc/passwd
user: "${UID}:${GID}"
My fpm dockerfile (./api/docker/fpm/Dockerfile)
FROM php:7.2.6-fpm
COPY ./init-app.sh /usr/local/bin/
COPY ./install-composer.sh /usr/local/bin/
RUN apt-get update && apt-get install -y --no-install-recommends libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev libpng-dev \
libzip-dev \
libzip4 \
git \
zip \
wget \
&& apt-get autoremove \
&& apt-get clean \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install gd \
&& docker-php-ext-configure zip --with-libzip=/usr/include/ \
&& docker-php-ext-install zip \
&& docker-php-ext-install pdo_mysql \
&& chmod +x /usr/local/bin/init-app.sh \
&& chmod +x /usr/local/bin/install-composer.sh \
&& /usr/local/bin/install-composer.sh \
&& rm /usr/local/bin/install-composer.sh \
&& wget https://raw.githubusercontent.com/vishnubob/wait-for-it/8ed92e8cab83cfed76ff012ed4a36cef74b28096/wait-for-it.sh \
&& chmod +x wait-for-it.sh \
&& mv wait-for-it.sh /usr/local/bin/
ENTRYPOINT [ "/usr/local/bin/init-app.sh" ]
CMD ["php-fpm"]
install-composer.sh installs composer into the container at build time.
init-app.sh:
#!/bin/sh
set -e
# Install composer dependencies
composer install
# Copy env file
cp .env.example .env
# Wait for DB to be up
/usr/local/bin/wait-for-it.sh db:3306 -t 0 --strict -- php artisan key:generate && php artisan migrate:refresh --seed
php artisan passport:install
# Run upstream entrypoint
# first arg is `-f` or `--some-option`
if [ "${1#-}" != "$1" ]; then
set -- php-fpm "$#"
fi
exec "$#"
My user is correctly mapped inside the fpm container as I export $UID and $GID in .zshrc. Commenting out the passport:install line in my init-app.sh in order to let container boot correctly, I'm able to generate the keys by running docker exec -it php artisan passport:install just fine. But letting the container handle it fails.
Turns out, one of my database seeder, somehow required the key to be present. while I investigate, I fixed the problem by swapping instructions (the seeding and passport keys installation)

ERR_EMPTY_RESPONSE with docker-compose of a Laravel app

I have a Laravel / VueJS app that I am trying to dockerize.
At the end of the Dockerfile, I have
CMD php artisan serve --host=0.0.0.0 --port=80
my docker-compose:
version: '3'
services:
app:
image: xoco/kendozone:local-1.0.1
ports:
- "8181:80"
When I run:
docker-compose up
I get:
Recreating local_app_1 ... done
Attaching to local_app_1
app_1 | [03-May-2018 18:20:21] NOTICE: fpm is running, pid 1
app_1 | [03-May-2018 18:20:21] NOTICE: ready to handle connections
that seems to be ok
But when I try to access it on
localhost:8181
I get a ERR_EMPTY_RESPONSE
Any idea how to fix it ?
EDIT: Add Dockerfile
FROM php:7.2-fpm
LABEL version="1.0.0"
ENV node_version 8.4.0
ENV npm_version 5.7.1
ENV NVM_DIR /.nvm
ENV APP_DIR="/var/www"
ENV APP_PORT="80"
ENV DOCKER_FOLDER="docker/local"
RUN echo "deb http://ftp.de.debian.org/debian stretch main " >> /etc/apt/sources.list \
&& apt-get update -y
RUN apt-get install -y openssl zip unzip git gcc make automake \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng-dev \
libmagickwand-dev vim --no-install-recommends
RUN apt-get purge --auto-remove -y g++ \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install pdo pdo_mysql mbstring zip -j$(nproc) iconv -j$(nproc) gd
WORKDIR $APP_DIR
COPY . $APP_DIR
RUN mkdir -p $APP_DIR/resources/assets/less/_main_full \
&& touch $APP_DIR/resources/assets/less/_main_full/main.less \
&& touch $APP_DIR/database/sqlite.db \
&& mv $DOCKER_FOLDER/.env.local .env \
&& chown -R www-data:www-data $APP_DIR
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer install --no-interaction
RUN mkdir -p $NVM_DIR && chown -R www-data:www-data $NVM_DIR
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash \
&& [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" \
&& nvm install ${node_version}
ENV NODE_PATH $NVM_DIR/v$node_version/lib/node_modules
ENV PATH $NVM_DIR/versions/node/v$node_version/bin:$PATH
RUN npm install --save-exact imagemin-pngquant#5.0.*
RUN npm install
RUN npm run production
RUN php artisan key:generate
RUN php artisan migrate --seed
CMD php artisan serve --host=0.0.0.0 --port=$APP_PORT

Docker network does not work with bash entrypoint

First, we have a Docker network like so:
docker network create cdt-net
Then I have this bash script which will start a selenium server:
cd $(dirname "$0")
./node_modules/.bin/webdriver-manager update
./node_modules/.bin/webdriver-manager start
The above bash script is called by this Dockerfile:
FROM openjdk:latest
RUN apt-get update && \
apt-get -y install sudo
RUN mkdir -p /root/cdt-webdriver
WORKDIR /root/cdt-webdriver
COPY start-selenium-server.sh .
ENTRYPOINT ["/bin/bash", "/root/cdt-webdriver/start-selenium-server.sh"]
I would build it like so:
docker build -t cdt-selenium .
and then run it like so:
docker run --network=cdt-net --name cdt-selenium -d cdt-selenium
the problem that I am having, is that even though everything is clean with no errors, other processes in the same Docker network cannot talk to the selenium server.
On the other hand, if I create a selenium server using a pre-existing image, like so:
docker run -d --network=cdt-net --name cdt-selenium selenium/standalone-firefox:3.4.0-chromium
then things are working as expected, and I can connect to the selenium server from other processes in the Docker network.
Anyone know what might be wrong with my bash script or Dockerfile? Perhaps my manually created Selenium server is not listening on the right host?
Here is the complete Dockerfile for reference:
FROM openjdk:latest
RUN apt-get update && \
apt-get -y install sudo
RUN sudo apt-get install -y curl
RUN sudo apt-get install -y apt-utils
RUN sudo apt-get -y update
RUN sudo apt-get -y upgrade
RUN sudo apt-get purge nodejs npm
RUN curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
RUN sudo apt-get install -y nodejs
RUN echo "before nodejs => $(which nodejs)"
RUN echo "before npm => $(which npm)"
RUN sudo ln -s `which nodejs` /usr/bin/node || echo "ignore error"
RUN mkdir -p /root/cdt-webdriver
WORKDIR /root/cdt-webdriver
COPY start-selenium-server.sh .
RUN rm -rf node_modules > /dev/null 2>&1
RUN npm init -f || echo "ignore non-zero exit code" > /dev/null 2>&1
RUN npm install webdriver-manager > /dev/null 2>&1
ENTRYPOINT ["/bin/bash", "/root/cdt-webdriver/start-selenium-server.sh"]
You should use -d only when you docker images run fine. Before that use -it.
Change you webdriver-manager to a global install
RUN npm install -g webdriver-manager > /dev/null 2>&1
ENTRYPOINT ["/bin/bash", "/root/cdt-webdriver/start-selenium-server.sh"]
Also change your start-selenium-server.sh to
webdriver-manager update
webdriver-manager start
And use below to run and check if there are any issues
docker run --network=cdt-net --name cdt-selenium -it cdt-selenium

Resources