I'm trying to kamal setup
my app by following this tutorial.
I set up 2 servers (one for the Ruby on Rails 7.1.2 app and one for the MySQL 8.0.31 database, both are Linux Ubuntu 23.10) and a NodeBalancer running on Linode.
My deploy.yml looks like this (I just changed sensitive references and removed comments):
service: my-app
image: myusername/my-app
servers:
web:
hosts:
- 1.1.1.79
registry:
username: myusername
password:
- KAMAL_REGISTRY_PASSWORD
env:
clear:
DB_HOST: 1.1.1.172
secret:
- RAILS_MASTER_KEY
- MYSQL_ROOT_PASSWORD
accessories:
db:
image: mysql:8.0
host: 1.1.1.172
port: 3306
env:
clear:
MYSQL_ROOT_HOST: '%'
secret:
- MYSQL_ROOT_PASSWORD
files:
# - config/mysql/production.cnf:/etc/mysql/my.cnf
- db/production.sql:/docker-entrypoint-initdb.d/setup.sql
directories:
- data:/var/lib/mysql
My Dockerfile looks like this (sensitive references changed):
# syntax = docker/dockerfile:1
# Make sure RUBY_VERSION matches the Ruby version in .ruby-version and Gemfile
ARG RUBY_VERSION=3.2.2
FROM registry.docker.com/library/ruby:$RUBY_VERSION-slim as base
# Rails app lives here
WORKDIR /var/www/my-app.com/public
# Set production environment
ENV RAILS_ENV="production" \
BUNDLE_DEPLOYMENT="1" \
BUNDLE_PATH="/usr/local/bundle" \
BUNDLE_WITHOUT="development"
# Throw-away build stage to reduce size of final image
FROM base as build_stage
# Install packages needed to build gems
RUN apt-get update -qq && \
apt-get install --no-install-recommends -y build-essential git libmariadb-dev-compat libmariadb-dev default-libmysqlclient-dev libvips pkg-config
# Install application gems
COPY Gemfile Gemfile.lock ./
RUN bundle install && \
rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git && \
bundle exec bootsnap precompile --gemfile
# Copy application code
COPY . .
# Precompile bootsnap code for faster boot times
RUN bundle exec bootsnap precompile app/ lib/
# We precompile assets locally. So, we disable assets precompile task.
## Precompiling assets for production without requiring secret RAILS_MASTER_KEY
#RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile
# Final stage for app image
FROM base
# Install packages needed for deployment
RUN apt-get update -qq && \
apt-get install --no-install-recommends -y curl libsqlite3-0 libvips && \
rm -rf /var/lib/apt/lists /var/cache/apt/archives
# Copy built artifacts: gems, application
COPY --from=build_stage /usr/local/bundle /usr/local/bundle
COPY --from=build_stage /var/www/my-app.com/public /var/www/my-app.com/public
# Run and own only the runtime files as a non-root user for security
RUN useradd rails --create-home --shell /bin/bash && \
chown -R rails:rails db log storage tmp
USER rails:rails
# Entrypoint prepares the database.
ENTRYPOINT ["/var/www/my-app.com/public/bin/docker-entrypoint"]
# Start the server by default, this can be overwritten at runtime
EXPOSE 3000
CMD ["./bin/rails", "server"]
I also setup routes get 'up' => 'rails/health#show', :as => :rails_health_check
, and many other things in app and on servers... please, ask for more info.
Now, I feel like I'm nearing the end of setup in seeing my app finally deployed.
When in the console I run kamal setup
then I get:
$ kamal setup
INFO [113abc39] Running /usr/bin/env mkdir -p .kamal on 1.1.1.79
INFO [113abc39] Finished in 0.576 seconds with exit status 0 (successful).
Acquiring the deploy lock...
Ensure Docker is installed...
INFO [23dc8290] Running docker -v on 1.1.1.79
INFO [8ce41345] Running docker -v on 1.1.1.172
INFO [23dc8290] Finished in 0.175 seconds with exit status 0 (successful).
INFO [1b47e0ed] Running /usr/bin/env mkdir -p .kamal on 1.1.1.79
INFO [1b47e0ed] Finished in 0.154 seconds with exit status 0 (successful).
INFO [8ce41345] Finished in 0.630 seconds with exit status 0 (successful).
INFO [fbc7dedc] Running /usr/bin/env mkdir -p .kamal on 1.1.1.172
INFO [fbc7dedc] Finished in 0.156 seconds with exit status 0 (successful).
Push env files...
INFO [167ead7f] Running /usr/bin/env mkdir -p .kamal/env/roles on 1.1.1.79
INFO [167ead7f] Finished in 0.153 seconds with exit status 0 (successful).
INFO Uploading .kamal/env/roles/my-app-web.env 100.0%
INFO [07758eff] Running /usr/bin/env mkdir -p .kamal/env/traefik on 1.1.1.79
INFO [07758eff] Finished in 0.149 seconds with exit status 0 (successful).
INFO Uploading .kamal/env/traefik/traefik.env 100.0%
INFO [6802051a] Running /usr/bin/env mkdir -p .kamal/env/accessories on 1.1.1.172
INFO [6802051a] Finished in 0.088 seconds with exit status 0 (successful).
INFO Uploading .kamal/env/accessories/my-app-db.env 100.0%
INFO [0e6437f6] Running /usr/bin/env mkdir -p $PWD/my-app-db/data on 1.1.1.172
INFO [0e6437f6] Finished in 0.153 seconds with exit status 0 (successful).
INFO [100f3756] Running /usr/bin/env mkdir -p my-app-db/docker-entrypoint-initdb.d on 1.1.1.172
INFO [100f3756] Finished in 0.154 seconds with exit status 0 (successful).
INFO Uploading /Users/MyUser/Sites/my-app/db/production.sql 100.0%
INFO [e795b56e] Running /usr/bin/env chmod 755 my-app-db/docker-entrypoint-initdb.d/setup.sql on 1.1.1.172
INFO [e795b56e] Finished in 0.162 seconds with exit status 0 (successful).
INFO [ef67d696] Running docker login -u [REDACTED] -p [REDACTED] on 1.1.1.172
INFO [ef67d696] Finished in 1.091 seconds with exit status 0 (successful).
INFO [79af1db2] Running docker run --name my-app-db --detach --restart unless-stopped --log-opt max-size="10m" --publish 3306:3306 --env-file .kamal/env/accessories/my-app-db.env --volume $PWD/my-app-db/docker-entrypoint-initdb.d/setup.sql:/docker-entrypoint-initdb.d/setup.sql --volume $PWD/my-app-db/data:/var/lib/mysql --label service="my-app-db" mysql:8.0 on 1.1.1.172
INFO [79af1db2] Finished in 0.828 seconds with exit status 0 (successful).
Log into image registry...
INFO [b13fcb2d] Running docker login -u [REDACTED] -p [REDACTED] as MyUser@localhost
INFO [b13fcb2d] Finished in 1.744 seconds with exit status 0 (successful).
INFO [89fdbda8] Running docker login -u [REDACTED] -p [REDACTED] on 1.1.1.79
INFO [89fdbda8] Finished in 0.962 seconds with exit status 0 (successful).
Build and push app image...
INFO [d7d4bf64] Running docker --version && docker buildx version as MyUser@localhost
INFO [d7d4bf64] Finished in 0.228 seconds with exit status 0 (successful).
INFO [d0df5bd3] Running docker buildx build --push --platform linux/amd64,linux/arm64 --builder kamal-my-app-multiarch -t myusername/my-app:1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285 -t myusername/my-app:latest --label service="my-app" --file Dockerfile . as MyUser@localhost
DEBUG [d0df5bd3] Command: docker buildx build --push --platform linux/amd64,linux/arm64 --builder kamal-my-app-multiarch -t myusername/my-app:1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285 -t myusername/my-app:latest --label service="my-app" --file Dockerfile .
DEBUG [d0df5bd3] #0 building with "kamal-my-app-multiarch" instance using docker-container driver
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #1 [internal] load build definition from Dockerfile
DEBUG [d0df5bd3] #1 transferring dockerfile: 2.96kB done
DEBUG [d0df5bd3] #1 DONE 0.0s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #2 resolve image config for docker.io/docker/dockerfile:1
DEBUG [d0df5bd3] #2 ...
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #3 [auth] docker/dockerfile:pull token for registry-1.docker.io
DEBUG [d0df5bd3] #3 DONE 0.0s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #2 resolve image config for docker.io/docker/dockerfile:1
DEBUG [d0df5bd3] #2 DONE 1.3s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #4 docker-image://docker.io/docker/dockerfile:1@sha256:ac85f380a63b13dfcefa89046420e1781752bab202122f8f50032edf31be0021
DEBUG [d0df5bd3] #4 resolve docker.io/docker/dockerfile:1@sha256:ac85f380a63b13dfcefa89046420e1781752bab202122f8f50032edf31be0021 done
DEBUG [d0df5bd3] #4 CACHED
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #5 [linux/amd64 internal] load metadata for registry.docker.com/library/ruby:3.2.2-slim
DEBUG [d0df5bd3] #5 DONE 1.3s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #6 [linux/arm64 internal] load metadata for registry.docker.com/library/ruby:3.2.2-slim
DEBUG [d0df5bd3] #6 DONE 1.3s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #7 [internal] load .dockerignore
DEBUG [d0df5bd3] #7 transferring context: 782B done
DEBUG [d0df5bd3] #7 DONE 0.0s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #8 [linux/arm64 base 1/2] FROM registry.docker.com/library/ruby:3.2.2-slim@sha256:14eba677236d3360f2b66595c7fa0f2440ed6e33c519befe4d11c1242a8815a8
DEBUG [d0df5bd3] #8 resolve registry.docker.com/library/ruby:3.2.2-slim@sha256:14eba677236d3360f2b66595c7fa0f2440ed6e33c519befe4d11c1242a8815a8 done
DEBUG [d0df5bd3] #8 DONE 0.0s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #9 [linux/amd64 base 1/2] FROM registry.docker.com/library/ruby:3.2.2-slim@sha256:14eba677236d3360f2b66595c7fa0f2440ed6e33c519befe4d11c1242a8815a8
DEBUG [d0df5bd3] #9 resolve registry.docker.com/library/ruby:3.2.2-slim@sha256:14eba677236d3360f2b66595c7fa0f2440ed6e33c519befe4d11c1242a8815a8 done
DEBUG [d0df5bd3] #9 DONE 0.0s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #10 [internal] load build context
DEBUG [d0df5bd3] #10 transferring context: 3.31MB 0.2s done
DEBUG [d0df5bd3] #10 DONE 0.3s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #11 [linux/amd64 build_stage 2/5] COPY Gemfile Gemfile.lock ./
DEBUG [d0df5bd3] #11 CACHED
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #12 [linux/amd64 base 2/2] WORKDIR /var/www/my-app.com/public
DEBUG [d0df5bd3] #12 CACHED
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #13 [linux/amd64 build_stage 1/5] RUN apt-get update -qq && apt-get install --no-install-recommends -y build-essential git libmariadb-dev-compat libmariadb-dev default-libmysqlclient-dev libvips pkg-config
DEBUG [d0df5bd3] #13 CACHED
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #14 [linux/amd64 build_stage 3/5] RUN bundle install && rm -rf ~/.bundle/ "/usr/local/bundle"/ruby/*/cache "/usr/local/bundle"/ruby/*/bundler/gems/*/.git && bundle exec bootsnap precompile --gemfile
DEBUG [d0df5bd3] #14 CACHED
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #15 [linux/arm64 build_stage 1/5] RUN apt-get update -qq && apt-get install --no-install-recommends -y build-essential git libmariadb-dev-compat libmariadb-dev default-libmysqlclient-dev libvips pkg-config
DEBUG [d0df5bd3] #15 CACHED
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #16 [linux/arm64 build_stage 2/5] COPY Gemfile Gemfile.lock ./
DEBUG [d0df5bd3] #16 CACHED
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #17 [linux/arm64 base 2/2] WORKDIR /var/www/my-app.com/public
DEBUG [d0df5bd3] #17 CACHED
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #18 [linux/arm64 build_stage 3/5] RUN bundle install && rm -rf ~/.bundle/ "/usr/local/bundle"/ruby/*/cache "/usr/local/bundle"/ruby/*/bundler/gems/*/.git && bundle exec bootsnap precompile --gemfile
DEBUG [d0df5bd3] #18 CACHED
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #19 [linux/arm64 build_stage 4/5] COPY . .
DEBUG [d0df5bd3] #19 DONE 0.4s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #20 [linux/amd64 build_stage 4/5] COPY . .
DEBUG [d0df5bd3] #20 DONE 0.4s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #21 [linux/amd64 build_stage 5/5] RUN bundle exec bootsnap precompile app/ lib/
DEBUG [d0df5bd3] #21 ...
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #22 [linux/arm64 build_stage 5/5] RUN bundle exec bootsnap precompile app/ lib/
DEBUG [d0df5bd3] #22 DONE 0.4s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #21 [linux/amd64 build_stage 5/5] RUN bundle exec bootsnap precompile app/ lib/
DEBUG [d0df5bd3] #21 ...
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #23 [linux/arm64 stage-2 1/4] RUN apt-get update -qq && apt-get install --no-install-recommends -y curl libsqlite3-0 libvips && rm -rf /var/lib/apt/lists /var/cache/apt/archives
DEBUG [d0df5bd3] #23 CACHED
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #24 [linux/arm64 stage-2 2/4] COPY --from=build_stage /usr/local/bundle /usr/local/bundle
DEBUG [d0df5bd3] #24 CACHED
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #25 [linux/arm64 stage-2 3/4] COPY --from=build_stage /var/www/my-app.com/public /var/www/my-app.com/public
DEBUG [d0df5bd3] #25 DONE 0.6s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #21 [linux/amd64 build_stage 5/5] RUN bundle exec bootsnap precompile app/ lib/
DEBUG [d0df5bd3] #21 DONE 3.6s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #26 [linux/arm64 stage-2 4/4] RUN useradd rails --create-home --shell /bin/bash && chown -R rails:rails db log storage tmp
DEBUG [d0df5bd3] #26 ...
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #27 [linux/amd64 stage-2 1/4] RUN apt-get update -qq && apt-get install --no-install-recommends -y curl libsqlite3-0 libvips && rm -rf /var/lib/apt/lists /var/cache/apt/archives
DEBUG [d0df5bd3] #27 CACHED
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #28 [linux/amd64 stage-2 2/4] COPY --from=build_stage /usr/local/bundle /usr/local/bundle
DEBUG [d0df5bd3] #28 CACHED
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #29 [linux/amd64 stage-2 3/4] COPY --from=build_stage /var/www/my-app.com/public /var/www/my-app.com/public
DEBUG [d0df5bd3] #29 DONE 0.9s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #26 [linux/arm64 stage-2 4/4] RUN useradd rails --create-home --shell /bin/bash && chown -R rails:rails db log storage tmp
DEBUG [d0df5bd3] #26 DONE 4.1s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #30 [linux/amd64 stage-2 4/4] RUN useradd rails --create-home --shell /bin/bash && chown -R rails:rails db log storage tmp
DEBUG [d0df5bd3] #30 DONE 2.8s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #31 exporting to image
DEBUG [d0df5bd3] #31 exporting layers
DEBUG [d0df5bd3] #31 exporting layers 2.1s done
DEBUG [d0df5bd3] #31 exporting manifest sha256:2189c7608c77c50b3d35dbee64f5f376522dd39606aaf0012c8d57be87bee6b5 done
DEBUG [d0df5bd3] #31 exporting config sha256:2864a102eb7a1bbb3344bac655ba7ccc7a9d5affd58d871e2a93c345661fbbac done
DEBUG [d0df5bd3] #31 exporting attestation manifest sha256:aa4681f6311223f61156d0627e70a3517cdd71ced8f5b9e06ac0872c0ee31ecc done
DEBUG [d0df5bd3] #31 exporting manifest sha256:f8f88ad52ffd1e826d52fc74d58da3e67f995ce724ce39ad560856036b5844b9 done
DEBUG [d0df5bd3] #31 exporting config sha256:fad286ba58ef9d3d91eb89e5f699c7522f104f043235401f8307ceba409a80a6 done
DEBUG [d0df5bd3] #31 exporting attestation manifest sha256:9a075bcfc897eb379da341ea9397221c24f888837db399ec2a5bf29e41fb76e1 done
DEBUG [d0df5bd3] #31 exporting manifest list sha256:c07f0f1527fa99cb7c3cd26de9c5b12937421e979952b608ae066179ef746ddb done
DEBUG [d0df5bd3] #31 pushing layers
DEBUG [d0df5bd3] #31 ...
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #32 [auth] myusername/my-app:pull,push token for registry-1.docker.io
DEBUG [d0df5bd3] #32 DONE 0.0s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] #31 exporting to image
DEBUG [d0df5bd3] #31 pushing layers 71.0s done
DEBUG [d0df5bd3] #31 pushing manifest for docker.io/myusername/my-app:1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285@sha256:c07f0f1527fa99cb7c3cd26de9c5b12937421e979952b608ae066179ef746ddb
DEBUG [d0df5bd3] #31 pushing manifest for docker.io/myusername/my-app:1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285@sha256:c07f0f1527fa99cb7c3cd26de9c5b12937421e979952b608ae066179ef746ddb 2.5s done
DEBUG [d0df5bd3] #31 pushing layers 2.2s done
DEBUG [d0df5bd3] #31 pushing manifest for docker.io/myusername/my-app:latest@sha256:c07f0f1527fa99cb7c3cd26de9c5b12937421e979952b608ae066179ef746ddb
DEBUG [d0df5bd3] #31 pushing manifest for docker.io/myusername/my-app:latest@sha256:c07f0f1527fa99cb7c3cd26de9c5b12937421e979952b608ae066179ef746ddb 1.3s done
DEBUG [d0df5bd3] #31 DONE 79.2s
DEBUG [d0df5bd3]
DEBUG [d0df5bd3] View build details: docker-desktop://dashboard/build/kamal-my-app-multiarch/kamal-my-app-multiarch0/bi4ia9ngc7sf2eu4nuj01q18u
INFO [d0df5bd3] Finished in 91.171 seconds with exit status 0 (successful).
INFO [51c3c4eb] Running docker image rm --force myusername/my-app:1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285 on 1.1.1.79
INFO [51c3c4eb] Finished in 0.192 seconds with exit status 0 (successful).
INFO [1857be3d] Running docker pull myusername/my-app:1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285 on 1.1.1.79
INFO [1857be3d] Finished in 11.152 seconds with exit status 0 (successful).
INFO [e848881f] Running docker inspect -f '{{ .Config.Labels.service }}' myusername/my-app:1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285 | grep -x my-app || (echo "Image myusername/my-app:1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285 is missing the `service` label" && exit 1) on 1.1.1.79
INFO [e848881f] Finished in 0.185 seconds with exit status 0 (successful).
Ensure Traefik is running...
INFO [b695fd6b] Running docker login -u [REDACTED] -p [REDACTED] on 1.1.1.79
INFO [b695fd6b] Finished in 1.116 seconds with exit status 0 (successful).
INFO [7afdf837] Running docker container start traefik || docker run --name traefik --detach --restart unless-stopped --publish 80:80 --volume /var/run/docker.sock:/var/run/docker.sock --env-file .kamal/env/traefik/traefik.env --log-opt max-size="10m" --label traefik.http.routers.catchall.entryPoints="http" --label traefik.http.routers.catchall.rule="PathPrefix(\`/\`)" --label traefik.http.routers.catchall.service="unavailable" --label traefik.http.routers.catchall.priority="1" --label traefik.http.services.unavailable.loadbalancer.server.port="0" traefik:v2.9 --providers.docker --log.level="DEBUG" on 1.1.1.79
INFO [7afdf837] Finished in 0.928 seconds with exit status 0 (successful).
Ensure app can pass healthcheck...
INFO [847c8b12] Running docker run --detach --name healthcheck-my-app-1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285 --publish 3999:3000 --label service=healthcheck-my-app -e KAMAL_CONTAINER_NAME="healthcheck-my-app" --env-file .kamal/env/roles/my-app-web.env --health-cmd "curl -f http://localhost:3000/up || exit 1" --health-interval "1s" myusername/my-app:1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285 on 1.1.1.79
INFO [847c8b12] Finished in 0.990 seconds with exit status 0 (successful).
INFO [611f0382] Running docker container ls --all --filter name=^healthcheck-my-app-1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285$ --quiet | xargs docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' on 1.1.1.79
INFO [611f0382] Finished in 0.310 seconds with exit status 0 (successful).
INFO container not ready (starting), retrying in 1s (attempt 1/7)...
INFO [0f73740a] Running docker container ls --all --filter name=^healthcheck-my-app-1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285$ --quiet | xargs docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' on 1.1.1.79
INFO [0f73740a] Finished in 0.213 seconds with exit status 0 (successful).
INFO container not ready (starting), retrying in 2s (attempt 2/7)...
INFO [cf876375] Running docker container ls --all --filter name=^healthcheck-my-app-1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285$ --quiet | xargs docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' on 1.1.1.79
INFO [cf876375] Finished in 0.150 seconds with exit status 0 (successful).
INFO container not ready (unhealthy), retrying in 3s (attempt 3/7)...
INFO [05982682] Running docker container ls --all --filter name=^healthcheck-my-app-1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285$ --quiet | xargs docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' on 1.1.1.79
INFO [05982682] Finished in 0.146 seconds with exit status 0 (successful).
INFO container not ready (unhealthy), retrying in 4s (attempt 4/7)...
INFO [d152421d] Running docker container ls --all --filter name=^healthcheck-my-app-1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285$ --quiet | xargs docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' on 1.1.1.79
INFO [d152421d] Finished in 0.179 seconds with exit status 0 (successful).
INFO container not ready (unhealthy), retrying in 5s (attempt 5/7)...
INFO [b206d097] Running docker container ls --all --filter name=^healthcheck-my-app-1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285$ --quiet | xargs docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' on 1.1.1.79
INFO [b206d097] Finished in 0.149 seconds with exit status 0 (successful).
INFO container not ready (unhealthy), retrying in 6s (attempt 6/7)...
INFO [de81913a] Running docker container ls --all --filter name=^healthcheck-my-app-1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285$ --quiet | xargs docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' on 1.1.1.79
INFO [de81913a] Finished in 0.160 seconds with exit status 0 (successful).
INFO container not ready (unhealthy), retrying in 7s (attempt 7/7)...
INFO [7930668d] Running docker container ls --all --filter name=^healthcheck-my-app-1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285$ --quiet | xargs docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' on 1.1.1.79
INFO [7930668d] Finished in 0.147 seconds with exit status 0 (successful).
INFO [10021bce] Running docker container ls --all --filter name=^healthcheck-my-app-1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285$ --quiet | xargs docker logs --tail 50 2>&1 on 1.1.1.79
INFO [10021bce] Finished in 0.250 seconds with exit status 0 (successful).
ERROR bin/rails aborted!
LoadError: libmariadb.so.3: cannot open shared object file: No such file or directory - /usr/local/bundle/ruby/3.2.0/gems/mysql2-0.5.5/lib/mysql2/mysql2.so (LoadError)
<internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
<internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
/usr/local/bundle/ruby/3.2.0/gems/bootsnap-1.17.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/usr/local/bundle/ruby/3.2.0/gems/zeitwerk-2.6.12/lib/zeitwerk/kernel.rb:38:in `require'
/usr/local/bundle/ruby/3.2.0/gems/mysql2-0.5.5/lib/mysql2.rb:36:in `<main>'
<internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
<internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
/usr/local/bundle/ruby/3.2.0/gems/bootsnap-1.17.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/usr/local/bundle/ruby/3.2.0/gems/zeitwerk-2.6.12/lib/zeitwerk/kernel.rb:38:in `require'
/var/www/my-app.com/public/config/application.rb:7:in `<main>'
/var/www/my-app.com/public/Rakefile:4:in `require_relative'
/var/www/my-app.com/public/Rakefile:4:in `<main>'
/usr/local/bundle/ruby/3.2.0/gems/railties-7.1.2/lib/rails/commands/rake/rake_command.rb:43:in `block in with_rake'
/usr/local/bundle/ruby/3.2.0/gems/railties-7.1.2/lib/rails/commands/rake/rake_command.rb:41:in `with_rake'
/usr/local/bundle/ruby/3.2.0/gems/railties-7.1.2/lib/rails/commands/rake/rake_command.rb:20:in `perform'
/usr/local/bundle/ruby/3.2.0/gems/railties-7.1.2/lib/rails/command.rb:156:in `invoke_rake'
/usr/local/bundle/ruby/3.2.0/gems/railties-7.1.2/lib/rails/command.rb:73:in `block in invoke'
/usr/local/bundle/ruby/3.2.0/gems/railties-7.1.2/lib/rails/command.rb:149:in `with_argv'
/usr/local/bundle/ruby/3.2.0/gems/railties-7.1.2/lib/rails/command.rb:69:in `invoke'
/usr/local/bundle/ruby/3.2.0/gems/railties-7.1.2/lib/rails/commands.rb:18:in `<main>'
<internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
<internal:/usr/local/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
/usr/local/bundle/ruby/3.2.0/gems/bootsnap-1.17.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
./bin/rails:4:in `<main>'
(See full trace by running task with --trace)
ERROR {
"Status": "unhealthy",
"FailingStreak": 2,
"Log": [
{
"Start": "2023-12-16T22:06:30.737462655+01:00",
"End": "2023-12-16T22:06:30.966660307+01:00",
"ExitCode": 1,
"Output": " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3000 after 14 ms: Couldn't connect to server\n"
},
{
"Start": "2023-12-16T22:06:31.975366539+01:00",
"End": "2023-12-16T22:06:32.198491049+01:00",
"ExitCode": 1,
"Output": " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\ncurl: (7) Failed to connect to localhost port 3000 after 9 ms: Couldn't connect to server\n"
}
]
}
INFO [1895c459] Running docker container ls --all --filter name=^healthcheck-my-app-1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285$ --quiet | xargs docker stop on 1.1.1.79
INFO [1895c459] Finished in 0.212 seconds with exit status 0 (successful).
INFO [501e14ae] Running docker container ls --all --filter name=^healthcheck-my-app-1752e623352cc3fb35bd1679d45bbc98194f017d_uncommitted_9c902faf2c966285$ --quiet | xargs docker container rm on 1.1.1.79
INFO [501e14ae] Finished in 0.239 seconds with exit status 0 (successful).
Finished all in 139.3 seconds
Releasing the deploy lock...
Finished all in 145.7 seconds
ERROR (Kamal::Cli::Healthcheck::Poller::HealthcheckError): Exception while executing on host 1.1.1.79: container not ready (unhealthy)
I don't understand well the problem: is it related to Traefik or MySQL? Where should I look for solving the problem?
MySQL is being installed in the build stage. I need to install it above that stage. Here is an updated Dockerfile.
Thanks to guy @acidtib from group Kamal on Discord.