現象
以下のような記述の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
参考