Docker bị lỗi khi chạy docker-compose up
Hello mọi người.
Mình đang học cài docker cho rails, tuy nhiên thì gặp mỗi chút lỗi mà mãi chưa fix được. Rất mong ai đó có thể giúp mình fix lỗi này.
Bị lỗi như sau ạ, đã chạy bundle i, update, kể cả bundle trong cache các kiểu con đà điểu và đều không bị lỗi gì, code giữa host và container đã mount ok.
- Cấu trúc thư mục
- Dockerfile
FROM ruby:2.7.1
ENV APP_PATH /app
WORKDIR $APP_PATH
RUN apt-get update \
&& apt-get install -y nodejs nano
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update \
&& apt-get install yarn -y
COPY Gemfile $APP_PATH
COPY Gemfile.lock $APP_PATH
RUN bundle i
RUN gem install rails -v 6.0.1
COPY ./app $APP_PATH
COPY docker/start.sh /usr/bin/
RUN chmod +x /usr/bin/start.sh
ENTRYPOINT ["start.sh"]
CMD ["rails", "s", "-b", "0.0.0.0"]
- docker-compose.yml
version: "3.5"
services:
mysql:
image: mysql
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- ./docker/database:/var/lib/mysql
adminer:
image: adminer
restart: always
ports:
- 8080:8080
app:
container_name: app
build: .
volumes:
- ./app:/app
ports:
- 3000:3000
environment:
DATABASEHOST: mysql
- docker/start.sh
#!/bin/bash
set -e
# Remove a potentially pre-existing server.pid for Rails.
rm -f /app/tmp/pids/server.pid
# Then exec the container's main process use CMD (what"s set as CMD in the Dockerfile).
exec "$@"
- Gemfile
source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
Thanks for helping !!!
1 CÂU TRẢ LỜI
Bạn không nên đặt bundle install
ngay vào trong câu lệnh RUN của Dockerfile. Thay vào đó, bạn nên chuyển bundle install
vào trong file start.sh
.
Ví dụ file start.sh
:
#!/bin/sh
bundle
rm /api/tmp/pids/server.pid
bundle exec rails s -b 0.0.0.0
Sau đó ở file docker-compose.yml
thì bổ sung volume:
app:
container_name: app
build: .
volumes:
- ./app:/app
- ./data/api/bundle:/usr/local/bundle
ports:
- 3000:3000
environment:
DATABASEHOST: mysql
Tìm hiểu thêm ở https://anonoz.github.io/tech/2019/03/10/rails-docker-compose-yml.html
Cảm ơn a, chạy ngon lành rồi ạ. Nhưng cho e hỏi tại sao ko để bundle trong Dockerfile luôn thế a???
@buivansaobg Theo mình hiểu thì làm vậy những gem sẽ được lưu ngay vào image, và mỗi lần muốn chạy bundle install/update cho dù chỉ 1 gem bạn cũng buộc phải tạo lại hoàn toàn image đó từ đầu, không tận dụng được layer cache của docker ịmage. Ở link mình đưa có giải thích rõ ràng hơn mình nhiều đó.