Yêu cầu thg 9 17, 2020 10:02 SA 367 0 1
  • 367 0 1
+1

Docker bị lỗi khi chạy docker-compose up

Chia sẻ
  • 367 0 1

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


Đã trả lời thg 9 17, 2020 10:29 SA
Đã được chấp nhận
+4

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

Chia sẻ
Avatar Sao Bui Van @buivansaobg
thg 9 18, 2020 3:26 SA

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???

Avatar Trần Xuân Thắng @tranxuanthang
thg 9 18, 2020 3:39 SA

@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 đó.

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí