【エラー】COPY failed: file not found in build context or excluded by .dockerignore: stat file_name: file does not exist を解決

現象

以下のような記述のDockerfileを用意しアプリケーションをコンテナ化しgcloud run deployでCloud Run上にデプロイしたところ、特定のファイル(今回はinit.incファイル)がアップされていないことに気が付きました。

FROM php:7.0-apache

# Configure PHP for Cloud Run.
# Precompile PHP code with opcache.
RUN docker-php-ext-install -j "$(nproc)" opcache pdo_mysql
RUN set -ex; \
  { \
    echo "; Cloud Run enforces memory & timeouts"; \
    echo "memory_limit = -1"; \
    echo "max_execution_time = 0"; \
    echo "; File upload at Cloud Run network limit"; \
    echo "upload_max_filesize = 32M"; \
    echo "post_max_size = 32M"; \
    echo "; Configure Opcache for Containers"; \
    echo "opcache.enable = On"; \
    echo "opcache.validate_timestamps = Off"; \
    echo "; Configure Opcache Memory (Application-specific)"; \
    echo "opcache.memory_consumption = 32"; \
  } > "$PHP_INI_DIR/conf.d/cloud-run.ini"

# Copy in custom code from the host machine.
WORKDIR /var/www/html
COPY . ./

# Use the PORT environment variable in Apache configuration files.
# https://cloud.google.com/run/docs/reference/container-contract#port
RUN sed -i 's/80/${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf

# Configure PHP for development.
# Switch to the production php.ini for production operations.
# RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
# https://github.com/docker-library/docs/blob/master/php/README.md#configuration
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"

COPY . ./ でコピーされてるはずだが、試しに以下のようにinit.incファイルを直接指定しCOPYすると、COPY failed: file not found in build context or excluded by .dockerignore: stat init.inc: file does not existというエラーが発生しました。

...
COPY . ./
COPY ./init.inc /
...

原因

上記エラーが起きている原因は、.gitignoreでinit.incを除外しているためのようです。.gitignoreで除外しているファイルはGCP上にアップされないようで、そのためfile does not existとなっていたようです。

対応

対策として、.gcloudignoreファイルをアプリケーションのルートディレクトリに作成し、.gitignoreを記載することで.gitignoreに記載したファイルもアップされるようになりました。また、GCP上にアップする必要のないファイル、ディレクトリも追記しました。

.gcloudignore

.gcloudignore
.git
.gitignore

参考