Docker image - Volumes cannot be linked - docker

I dockerized my application, so I sent my files in the image with the COPY command in dockerfile
Here my dockerfile
FROM wordpress:php7.4-apache
COPY ./site /var/www/html
RUN chmod -R 777 /var/www/html/wp-content
ENV PHP_OPCACHE_VALIDATE_TIMESTAMPS="0"
When I use the image with docker-compose and when I link the volume with my local directory I do not recover the files I had sent during the creation of the image
Here my docker-compose.yml file
version: "3.8"
services:
ict:
image: name_of_my_new_image
volumes:
- .:/var/www/html
ports:
- 80:80
restart: always
Anyone have a solution please?

Try something like this
version: '2'
services:
wordpress:
depends_on:
- db
image: wordpress:5.5.0-php7.2-apache
ports:
- "8080:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: P#ssw0rdjbc83
volumes:
- /tmp/wordpress.ini:/usr/local/etc/php/conf.d/wordpress.ini
volumes:
db_data:
Which file you want to mount? I used ini to set my PHP option values.

Related

Docker Compose not reading multiple files

Using the below docker compose files, i am unable to bring up my app correctly. Docker says my LAPIS_ENV environment variable is not set, but i am setting it in my second compose file which I am expecting to be merged into the first one. I have tried including them in reverse order to no avail.
version: '2.4'
services:
backend:
mem_limit: 50mb
memswap_limit: 50mb
build:
context: ./backend
dockerfile: Dockerfile
depends_on:
- postgres
volumes:
- ./backend:/var/www
- ./data:/var/data
restart: unless-stopped
command: bash -c "/usr/local/bin/docker-entrypoint.sh ${LAPIS_ENV}"
postgres:
build:
context: ./postgres
dockerfile: Dockerfile
environment:
PGDATA: /var/lib/postgresql/data/pgdata
POSTGRES_HOST_AUTH_METHOD: trust
volumes:
- postgres:/var/lib/postgresql/data
- ./postgres/pg_hba.conf:/var/lib/postgres/data/pg_hba.conf
- ./data/backup:/pgbackup
restart: unless-stopped
volumes:
postgres:
version: '2.4'
services:
backend:
environment:
LAPIS_ENV: development
ports:
- 8080:80
#!/usr/bin/env bash
docker compose -f docker-compose.yml -f docker-compose.dev.yml up

How to swap env file for another docker service

I have a docker-compose.yml
services:
nextjs:
container_name: next_app
build:
context: ./
restart: on-failure
command: npm run dev
volumes:
- ./:/app
- /app/node_modules
- /app/.next
ports:
- "3000:3000"
cypress:
image: "cypress/included:9.4.1"
depends_on:
- next_app
environment:
- CYPRESS_baseUrl=http://nextjs:3000
working_dir: /e2e
volumes:
- ./e2e:/e2e
I want to change env_file for next_app from cypress service. I found solution like this
cypress:
image: "cypress/included:9.4.1"
depends_on:
- next_app
environment:
- CYPRESS_baseUrl=http://nextjs:3000
working_dir: /e2e
volumes:
- ./e2e:/e2e
next_app:
env_file: .env.test
But this solution does not work. Is it even possible ?
Try something like cp .env #docker/.env
No. In Compose (or Docker, or even more generally in Linux/Unix) there is no way for one container (process) to specify environment variables for another.
You can think of a docker-compose.yml file as a set of instructions only for running containers. If you need a specific set of containers for a specific context – you don't normally need to run Cypress in production, but this is an integration-test setup – it's fine to write a separate Compose file just for that setup.
# docker-compose.cypress.yml
# Used only for integration testing
version: '3.8'
services:
nextjs:
build: .
restart: on-failure
ports:
- "3000:3000"
env_file: .env.test # <-- specific to this test-oriented Compose file
cypress:
build: ./e2e
depends_on:
- nextjs
environment:
- CYPRESS_baseUrl=http://nextjs:3000
docker-compose -f docker-compose.cypress.yml up --build
This can also be a case where using multiple Compose files together can be a reasonable option. You can define a "standard" Compose setup that only defines the main service, and then an e2e-test Compose file that adds the Cypress container and the environment settings.
# docker-compose.yml
version: '3.8'
services:
nextjs:
image: registry.example.com/nextjs:${NEXTJS_TAG:-latest}
restart: on-failure
ports:
- '3000:3000'
# docker-compose.e2e.yaml
version: '3.8'
services:
nextjs:
# These add to the definitions in the base `docker-compose.yml`
build: .
env_file: .env.test
cypress:
# This is a brand new container for this specific setup
depends_on: [nextjs]
et: cetera # copy from question or previous Compose setup
docker-compose \
-f docker-compose.yml \
-f docker-compose.e2e.yml \
up --build

Docker-compose Error cannot locate specified Dockerfile: Dockerfile

When I run docker-compose up I am getting following ERROR: cannot locate specified Dockerfile:Dockerfile
here is my docker-compose file:
version: "3"
services:
player-docker:
build: ./src/main/java/spring/multiple/mongo/project/player
restart: always
ports:
- 8080:8080
depends_on:
- db
game-docker:
build: ./src/main/java/spring/multiple/mongo/project/game
restart: always
ports:
- 8080:8080
depends_on:
- db
score-docker:
build: ./src/main/java/spring/multiple/mongo/project/score
restart: always
ports:
- 8080:8080
depends_on:
- db
db:
image: mongo
volumes:
- mongodata:/data/db
ports:
- "27017:27017"
restart: always
volumes:
mongodata:
and I have three Dockerfiles each for player service, game service and score service in different locations.
This is my Dockerfile:
FROM openjdk:8
COPY target/demo-0.0.1-SNAPSHOT.jar score.jar
EXPOSE 8080
ENTRYPOINT ["java","-Dspring.data.mongodb.uri=mongodb://db:27017/","-jar","-Djava.rmi.server.hostname=0.0.0.0", "score.jar"]
I think you should revise your docker-compose file similar to the following:
score-docker:
build:
context: ./
dockerfile: ./src/main/java/spring/multiple/mongo/project/score/Dockerfile
The point is, you need include your target/demo-0.0.1-SNAPSHOT.jar score.jar into the docker build context. Otherwise, the Dockerfile COPY instruction will not able to find the file.
(I suppose you have the targer folder sibling as src folder).

Dockerfile - possible command line argument?

I have a value in a Dockerfile called ${APP_NAME}. What is it? If this were bash scripting, I would assume it to be some sort of variable but it hasn't been assigned a value anywhere. Is it a command line argument? If so, how would I pass it in when I wanted to call docker-compose with it?
For reference, the Docker file looks like this:
version: '2'
services:
nginx:
container_name: ${APP_NAME}_nginx
hostname: nginx
build:
context: ./containers/nginx
dockerfile: Dockerfile
ports:
- "80:80"
- "443:443"
volumes:
- .:/app
links:
- phpfpm
networks:
- backend
phpfpm:
container_name: ${APP_NAME}_phpfpm
hostname: phpfpm
expose:
- "9000"
build:
context: ./containers/php-fpm
dockerfile: Dockerfile
working_dir: /app
volumes:
- .:/app
links:
- mysql
networks:
- backend
mysql:
container_name: ${APP_NAME}_mysql
hostname: mysql
build:
context: ./containers/mysql
dockerfile: Dockerfile
volumes:
- ./storage/mysql:/var/lib/mysql
- ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
environment:
- MYSQL_DATABASE=${DB_DATABASE}
- MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
ports:
- "33061:3306"
expose:
- "3306"
networks:
- backend
networks:
backend:
driver: "bridge"
And actually, I'm probably going to have a lot of questions about docker because I've never really used it before so a reference to Dockerfile syntax would be helpful.
This means that there is probably somewhere in your project .env file which contains variables necessary for docker compose. You can find more about it at the official docker compose docs. It says that you can set default values for environment variables using a .env file, which Compose automatically looks for. Values set in the shell environment override those set in the .env file. Try to find more here: https://docs.docker.com/compose/compose-file/#variable-substitution

Docker volume files not propagating

Hi I have been trying to make my following docker(based on moodle) compose file work
version: '2'
services:
mysql:
image: "mysql/mysql-server"
container_name: moodle-db
restart: always
env_file: .env
volumes:
- ./moodle-db:/var/lib/mysql:z
apache:
image: my-moodle-image:latest
container_name: moodle
restart: always
env_file: .env
ports:
- "8080:80"
depends_on:
- mysql
volumes:
- ./moodledata:/var/www/moodledata:z
#- ./themes:/var/www/theme
And it works as long as the commented line remains like that.
/var/www/theme has some files, but when mounting the folders goes empty instead of propagaiting the files to the file system.
can anyone point out, the why?
Thanks in advance
Tringing to base myself of https://docs.docker.com/engine/admin/volumes/#good-use-cases-for-tmpfs-mounts, in the following text:
If the container’s image contains data at the mount point, this data will be propagated into the bind mount or volume.

Resources